每次我在调试模式下跳过Java Scanner读取到下一个分隔符

时间:2016-06-13 21:31:28

标签: java java.util.scanner

我正在阅读标准输入的输入。我的输入数据有多行,第一行有记录总数,第二行有记录开始。每一行都是一条记录。我们将有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

这不是预期的行为。为什么呢?

1 个答案:

答案 0 :(得分:2)

Scanner#nextside-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");
 }