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

使用Java Scanner读取文件构造WordLadder时为何运行一次就等待输入

问题根因

你遇到的阻塞问题核心原因是待读取的token总数量为奇数,循环内每次读取2个token,最后剩余1个token时触发异常逻辑:

  • 你的输入文件中所有空格分隔的字符串一共为7个:dears、fears、heart、heart、sail、ruin、etc,总数为奇数
  • 测试代码每次循环仅读取1个token,7次循环读完所有内容后hasNext()返回false,循环正常退出
  • 业务代码每次循环需要读取2个token:前3次循环读完前6个token,第4次循环判断hasNext()返回true(还剩etc这个token),第一次next()调用拿到etc赋值给s,调用第二次next()时已经没有可用token,就会触发异常或阻塞。

另外你贴出的第一份业务代码存在语法错误:catch (FileNotFoundException ex) 后缺少左大括号,若实际运行代码也是这个写法会直接编译失败,若只是粘贴疏漏可忽略。

修复方案

方案1:增加边界校验(推荐)

每次读取前判断是否有足够的可用token,避免剩余单个token导致的问题:

try {
    Scanner sc = new Scanner(new File("input.txt"));
    while (sc.hasNext()) {
        String s = sc.next();
        // 判断是否还有第二个配对的token
        if (!sc.hasNext()) {
            // 自定义剩余单个token的处理逻辑,例如打印提示
            System.out.println("无配对的单个单词:" + s);
            break;
        }
        String s2 = sc.next();
        WordLadder wl = new WordLadder(s, s2);
        System.out.print(wl.toString());
    }
    sc.close();
} catch (FileNotFoundException ex) {
    System.out.print("File not found");
}

方案2:清理输入文件

直接删除输入文件最后一行无配对的etc,保证所有单词都是成对出现,即可解决当前问题。

补充排查点

如果按上述方案修改后仍存在阻塞问题,可检查WordLadder类的构造方法或toString()方法内部是否有创建基于System.in的Scanner实例、或者调用了读取控制台输入的相关逻辑,这部分逻辑会在对象创建或输出时触发控制台输入等待。

内容的提问来源于stack exchange,提问作者Peter Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:27:01