You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:07:37