java - Java-方法似乎在第二次调用时跳过了一步
问题描述
我正在用 Java 编写一个简单的“购物篮”程序,在过去的 10 年里根本没有使用它,我只是想再次熟悉它......
我的程序目前有 3 个类:Program.java
, Basket.java
& Item.java
。
Program.java
定义为:
public class Program {
public static int menuSelection = 0;
public static Scanner kb = new Scanner(System.in);
public static Basket basket = new Basket();
public static void main(String[] args) {
// TODO Auto-generated method stub
//Program p = new Program();
menu();
}
public static void menu() {
System.out.println("Press 1 to add an item to the basket. ");
System.out.println("Press 2 to remove an item from the basket. ");
System.out.println("Press 3 to display the basket contents. ");
System.out.println("Press 9 to proceed to checkout. ");
System.out.println("Press 0 to exit program");
menuSelection = kb.nextInt();
if(menuSelection == 1) {
basket.addItemToBasket();
} else if(menuSelection == 2) {
basket.removeItemFromBasket();
} else if (menuSelection == 3) {
basket.displayBasket();
} else if(menuSelection == 9) {
System.out.println("Proceed to checkout");
} else if(menuSelection == 0) {
System.exit(0);
}
}
}
Basket.java
定义为:
public class Basket {
public ArrayList<Item> basket = new ArrayList<Item>();
public Scanner kb = new Scanner(System.in);
public Item item = new Item();
public Program prog = new Program();
public void addItemToBasket() {
System.out.println("Enter the name of the item: ");
item.name = kb.nextLine();
System.out.println("Enter the price of the item: ");
item.price = kb.nextDouble();
basket.add(item);
item.name = null;
item.price = 0;
Program.menu();
}
public void removeItemFromBasket() {
System.out.println("Which item would you like to remove? ");
item.name = kb.nextLine();
if(basket.contains(item.name) ) {
basket.remove(item);
} else {
System.out.printf("There is no %s currently in the basket! ", item.name);
}
}
public String displayBasket() {
return basket.toString();
}
}
此刻,如果我运行程序,菜单会显示在控制台中,当我选择'1'时,addItemToBasket()
会调用该方法,我在第一个提示符处输入名称&在第二个提示符处输入价格,菜单为然后再次显示。
但是,此时,如果我再次选择“1”,将另一个项目添加到购物篮中,则第一个和第二个提示将一起显示......即,而不是:
输入项目名称:
// 等待用户输入
输入商品的价格:
// 等待用户输入
表明:
输入项目名称:
输入商品的价格:
如果我尝试输入除数字以外的任何内容,程序就会崩溃,因为它需要一个双精度值......
我究竟做错了什么?为什么该addItemToBasket()
方法在第二次和后续调用时会跳过该item.name = kb.nextLine();
行?
解决方案
我以前从我的一个学生那里看到过这个。问题是您正在从相同的输入创建两个不同的扫描仪。这意味着每个扫描仪都在读取同一组输入。尝试只传递一个扫描仪进行阅读,我敢打赌你的程序将再次开始运行。
这里有更详细的解释。程序创建 Scannerkb
并读取您输入的下一个整数1
。然后 Basket 的实例kb
读取整行。感觉就像它跳过了这个读取,但它实际上是从流的开头读取的。如果您打印item.name
,您会看到 1。现在它会询问您的价格。您输入一个读得很好的数字并返回主菜单。但是,最后读取的主菜单1
仍然包含您输入的所有其他输入,以供 Basket 阅读。这就是为什么它对期待一个双精度和接收无效字符感到生气的原因。
推荐阅读
- java - Power mockito 验证静态调用真实方法
- visual-studio-2017 - Visual Studio 2017 如何跳转到 C++ 基础方法
- bitbucket - 来自其他作者的 Bitbucket 提交未拉动
- docker - 如何将 Docker 的 `--privileged` 标志添加到 Kubernetes pod 规范容器 YAML 定义
- excel - 从excel单元格中获取几个标签
- javascript - 在AngularJS中设置范围之前如何等待图像加载?
- canvas - 是否可以在 Cesium 上放置 HTML 元素(项目)?
- vue.js - 如何在Vue中直接从flask返回JSON格式
- angular - 如何在ngFor内部的表中传递数组值?
- javascript - 当某个 div 存在时如何隐藏元素?