java - 每次我在 Debug模式下单步执行时,Java Scanner 都会读取直到下一个分隔符

标签 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();
    ...
}

但是,在 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#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");
 }

关于java - 每次我在 Debug模式下单步执行时,Java Scanner 都会读取直到下一个分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37799474/

相关文章:

java - Selenium : Check an Element present at any point of time

java - 如何处理 Android 中的后台任务队列?

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 检测标准输入的空输入

java - Java中使用Scanner读取整行字符串

java - 向用户询问 H

java - Open GL 转换

java - 在 Android Activity 中访问数据

java - 如何增加 JRadioButtons 和 JCheckBoxes 的大小?

java - 我该如何用扫描仪(java)处理它?