使用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
相关产品推荐
相关产品推荐

