此问题已在此处有答案:
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()也应该给予错误,但是它没有。
2条答案
按热度按时间h79rfbju1#
productName在这里被赋值为
System.lineSeparator
,因为您刚刚打印了一个新行。当你相信你插入的是productName时,你实际上插入的是nextInt()
将在这里读取的值:xqkwcwgp2#
你的代码中有一个小错误
//scnr.nextLine();
这一行是重要的阅读\n
之前的巧克力片,如果你不使用一个虚拟的scnr.nextLine();
读取新的一行,那么新的一行将在这里读取-这里
productName
的值为\n
,当它尝试读取时-它期望读取
int
,但发现String
,因此抛出异常。