我正在从标准输入读取输入。我的输入数据有多行,第一行有记录总数,从第二行开始记录。每一行都是一个记录。我们将有 n+1 行。所以我想用 nextInt()
读取第一行的编号。这是我的代码:
Scanner scanner = new Scanner(System.in);
//read number of lines for scanner to break loop
int numRecords = 0;
if (scanner.hasNextInt()){
numRecords = scanner.nextInt();
...
}
但是,在 Debug模式下,每次按 F6 时,我都会看到 scanner.next()
发生变化。当我有以下几行测试数据作为输入时:
3
1,1,bugs@bunny.com,123 Sesame St.,New York,NY,10011,12345689010
2,1,elmer@fudd.com,123 Sesame St.,New York,NY,10011,10987654321
3,2,bugs@bunny.com,123 Sesame St.,New York,NY,10011,12345689010
当我到达代码的第 3 行时,
int numRecords = 0;
scanner.next()
是 3
。但是,当到达第 4 行时,
if (scanner.hasNextInt()){
它是 1,1,bugs@bunny.com,123
,因此 if
条件永远不会是 true
,因为 scanner .next()
不是 3
。下次我按 F6 时,它会更改为 Sesame
。
这不是预期的行为。为什么?
最佳答案
Scanner#next
是 side-effects 的方法。这意味着它的执行会改变环境中的某些内容。但是,调试器无法区分 pure 方法和具有副作用的方法。因此,一旦您将表达式 scanner.next()
添加到监视列表,调试器就会在每个调试步骤上对其进行评估,并推进输入,这就是您所观察到的。
在观看 scanner.next()
时无法调试当前代码,因此您应该:
- 更改调试代码的方式 - 从监视的表达式中删除
scanner.next()
。 - 更改代码以使其能够进行调试 - 添加一个用于存储中间解析输入的变量。
考虑到输入的格式,您可以创建一个函数来 tokenize 输入,然后调试其他函数如何处理每个标记。理想情况下,您希望调试一个函数 parseRecord(String)
,它可以轻松验证,而无需每次重新输入数据:
public static void main(String args[]) {
parseRecord("1,1,bugs@bunny.com,123 Sesame St.,New York,NY,10011,12345689010");
}
关于java - 每次我在 Debug模式下单步执行时,Java Scanner 都会读取直到下一个分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37799474/