我有以下代码
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() 读取第一个数量也应该报错,但是没有。
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();
这行在巧克力片之前阅读 \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
因此抛出异常。