代码之家  ›  专栏  ›  技术社区  ›  Noble-Surfer

Java方法似乎在第二次调用中跳过了一步

  •  0
  • Noble-Surfer  · 技术社区  · 7 年前

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

    我的程序目前有3个类: Program.java , Basket.java 和; Item.java .

    程序.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);
            }
        }
    
    }
    

    篮子.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(); 在第二次和之后的调用中排列?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Spidy    7 年前

    我以前从我的一个学生那里见过这个。问题是您正在从同一输入创建两个不同的扫描仪。这意味着每个扫描器都在读取同一组输入。试着把一个扫描器传过来阅读,我打赌你的程序会重新开始运行。

    这里有一个更详细的解释。程序创建名为 kb 并读取您输入的下一个整数 1 . 然后是basket的实例 知识库 读取整行。它感觉好像跳过了这段阅读,但实际上它是从流的开头开始阅读的。如果你打印 item.name 你会看到一个1。现在它向你要价。您输入一个读数正常的数字,然后返回主菜单。但是,最后一次读取的主菜单 仍然有您输入的所有其他输入供选择篮读取。这就是为什么它对期望双精度值和接收无效字符感到恼火的原因。

        2
  •  0
  •   Xitrum    7 年前

    作为@spidy pined point,它与您的输入流有关。看看这个,两个扫描仪共享相同的输入流:

    new Scanner(System.in);
    

    所以当您执行nextline()时,它需要一个新行输入。快速修复将代替nextline(),只使用next()。

    P/S:检查@azro的注释,您在basket类中有未使用的代码。