Java Scanner next() 读取范围问题

Java Scanner next() reading range question

我有以下代码

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()也应该报错,但是没有' t.

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

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

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

你的代码有点问题
//scnr.nextLine(); 这行在 Chocolate Chips 之前阅读 \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 因此抛出异常。