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

问题描述 投票:0回答:2

我有以下代码

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() 读取第一个数量也应该报错,但是没有。

java input java.util.scanner newline
2个回答
2
投票
  System.out.println();
  productName = scnr.nextLine();

productName 在这里被赋予

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

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

1
投票

你的代码有点问题

//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
因此抛出异常。

© www.soinside.com 2019 - 2024. All rights reserved.