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
因此抛出异常。
我有以下代码
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
因此抛出异常。