Java Scanner next()阅读范围问题[重复]

xurqigkl  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(197)

此问题已在此处有答案

Scanner is skipping nextLine() after using next() or nextFoo()?(25个回答)
两年前关闭。
我有以下代码

public class ShoppingCartPrinter {
   public static void main(String[] args) {
      
      String productName;
      int productPrice = 0;
      int productQuantity = 0;
      int cartTotal = 0;
      
      String testStr = "Chocolate Chips\n3\n1\nChocolate Chips\n3\n1";
      
      Scanner scnr = new Scanner(testStr);

      productName = scnr.nextLine();
      System.out.println("1st Name " + productName);

      productPrice = scnr.nextInt();
      System.out.println("1st Price " + productPrice);

      productQuantity = scnr.nextInt();
      System.out.println("1st Quantity " + productQuantity);
      
      System.out.println();
      
      //scnr.nextLine();
      
      productName = scnr.nextLine();
      System.out.println("2nd Name " + productName);

      productPrice = scnr.nextInt();
      System.out.println("2nd Price " + productPrice);

      productQuantity = scnr.nextInt();
      System.out.println("2nd Quantity " + productQuantity);

   }
}

因此,如果我不包含第27行,我会得到一个带有错误消息的输出:

1st Name Chocolate Chips
1st Price 3
1st Quantity 1

2nd Name 

Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
    at ShoppingCartPrinter.main(ShoppingCartPrinter.java:30)

我知道第28行的scnr.nextLine()没有正确读取,因为之前的scnr.nextInt()没有使用/n。但是,我不明白为什么第31行的scnr.nextInt()不继续读取字符串中的下一个整数?
此外,如果nextInt()只能读取一行,或者它不能传递/n,那么第二个读取第一个数量的nextInt()也应该给予错误,但是它没有。

h79rfbju

h79rfbju1#

System.out.println();
  productName = scnr.nextLine();

productName在这里被赋值为System.lineSeparator,因为您刚刚打印了一个新行。当你相信你插入的是productName时,你实际上插入的是nextInt()将在这里读取的值:

productPrice = scnr.nextInt(); //this will read the text you wanted for productName
xqkwcwgp

xqkwcwgp2#

你的代码中有一个小错误

//scnr.nextLine();这一行是重要的阅读\n之前的巧克力片,如果你不使用一个虚拟的scnr.nextLine();读取新的一行,那么新的一行将在这里读取-

productName = scnr.nextLine();
      System.out.println("2nd Name " + productName);

这里productName的值为\n,当它尝试读取时-

productPrice = scnr.nextInt();
      System.out.println("2nd Price " + productPrice);

它期望读取int,但发现String,因此抛出异常。

相关问题