gpt4 book ai didi

Java-方法似乎在第二次调用时跳过了一个步骤

转载 作者:行者123 更新时间:2023-12-01 17:50:08 25 4
gpt4 key购买 nike

我正在用 Java 编写一个简单的“购物篮”程序,在过去 10 年里根本没有使用它,我只是想再次熟悉它......

我的程序当前有 3 个类:Program.javaBasket.javaItem.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”,将另一个项目添加到购物篮中,第一个和第二个提示将一起显示......即而不是:

Enter the name of the item:

// Wait for user input

Enter the price of the item:

// Wait for user input

它显示:

Enter the name of the item:

Enter the price of the item:

如果我尝试输入数字以外的任何内容,程序就会崩溃,因为它需要一个 double 值...

我做错了什么?为什么 addItemToBasket() 方法在第二次及后续调用时会跳过 item.name = kb.nextLine(); 行?

最佳答案

我以前从我的一个学生那里看到过这个。问题是您正在从同一输入创建两个不同的扫描仪。这意味着每个扫描仪正在读取同一组输入。尝试仅传递一台扫描仪进行读取,我敢打赌您的程序将再次开始运行。

这里有更详细的解释。程序创建名为 kb 的扫描器,并读取您输入 1 的下一个整数。然后 Basket 的 kb 实例读取整行。感觉它跳过了这次读取,但实际上它是从流的开头读取的。如果您打印 item.name,您会看到 1。现在它会询问您价格。您输入一个可以正常读取的数字并返回主菜单。但是,最后读取 1 的主菜单仍然包含您输入的所有其他输入供篮子读取。这就是为什么它对期待 double 和接收无效字符感到愤怒。

关于Java-方法似乎在第二次调用时跳过了一个步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51149054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com