Scanner.hasNext()无需等待时却阻塞,求代码结构问题排查
Scanner判断剩余输入失效,程序无输入时持续等待的问题
我想在程序首次运行后检查Scanner是否还有剩余输入,但当没有输入可处理时,程序没有停止,反而一直等待新输入。我的代码结构哪里有问题?
原代码如下:
public static void main(String[] args) { @SuppressWarnings("resource") Scanner reader = new Scanner(System.in); String line = ""; int loop = 0; while(true) { StringBuilder sb = new StringBuilder(); if (loop == 0) sb.append(reader.nextLine() + " "); else { sb.append(line + " "); reset(); } while (true) { line = lukija.nextLine() + " "; // 注:此处lukija应为reader,推测是拼写笔误 if (line.equals("0 ")) { sb.append(" 0 "); break; } sb.append(line); } // 后续调用其他方法的代码,与Scanner无关,此处省略 // if (reader.hasNext()) line = reader.nextLine(); else line = null; if (line == null || line.equals("0 ")) break; loop++; } }
测试输入如下:
1 500 -1 deadPerson 0 0 2 kidA 0 1 3 kidB 1 0 0 0
我期望reader.hasNext()返回false,程序只运行一次(单独的0作为分隔符)。之前靠这段代码处理:
if (line.equals("0 ")) { sb.append(" 0 "); break;
但现在Scanner已经没有输入时,本该把line设为null,结果程序反而在等待更多输入。
我试过用try-catch结构、reader.hasNextLine()、reader.next(),还有直接检查null值,都没解决问题。现在没法通过Scanner的方法判断是否还有剩余输入来终止程序,不知道该怎么办。
问题解决(编辑补充)
后来发现之前找错了问题点,修改Scanner写入StringBuilder的循环就解决了。新增布尔变量endLoop = false,找到第一个0后读取下一个单词,如果是"0"就把endLoop设为true,最后在代码末尾终止循环。
修改后的代码片段:
else while (true) { line = reader.nextLine() + " "; if (line.equals("0 ")) { line = reader.next(); if (line.equals("0")) endLoop = true; sb.append(" 0 "); break; } sb.append(line); }
// 后续代码省略 //
if (endLoop) break; loop++;
这个方案可能不是最优的,但作为编程新手,保留line变量方便调试时跟踪每一步操作和写入StringBuilder的内容。
内容的提问来源于stack exchange,提问作者Jen
相关产品推荐
相关产品推荐

