我正在阅读标准输入的输入。我的输入数据有多行,第一行有记录总数,第二行有记录开始。每一行都是一条记录。我们将有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();
...
}
但是,在调试模式下,每次按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
。
这不是预期的行为。为什么呢?
答案 0 :(得分:2)
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");
}