在ZyBooks运行Java代码输出正常但触发NoSuchElementException异常求助
java.util.NoSuchElementException异常排查与修复
问题原因
你的代码触发java.util.NoSuchElementException的核心原因是未检查输入流是否还有可用数据,就直接调用Scanner的next()或nextInt()方法:
- 当输入流耗尽(比如用户输入完最后一组数据后结束输入,或输入"Stop"后没有对应整数输入),
Scanner尝试读取不存在的元素时就会抛出该异常。 - 当前逻辑中,即便读取到
inputString为"Stop",循环终止前的最后一次迭代里,程序依然会执行inputInt = scnr.nextInt(),若此时无整数输入,就会触发异常。
修复方案
在每次调用next()和nextInt()前,分别用hasNext()和hasNextInt()检查输入是否存在;同时调整循环逻辑,确保读取到"Stop"时不再尝试读取整数。
修复后的完整代码
import java.util.Scanner; public class Inputkey { public static void main(String[] args) { Scanner scnr = new Scanner(System.in); String inputString = ""; int inputInt = 0; // 外层判断输入流是否还有数据 while (scnr.hasNext()) { inputString = scnr.next(); // 读到Stop直接终止循环,不再读取后续整数 if (inputString.equals("Stop")) { break; } // 检查是否有可用整数输入 if (scnr.hasNextInt()) { inputInt = scnr.nextInt(); if (inputInt <= 35) { System.out.println(inputString + ": reorder soon"); } } else { // 处理无效整数输入,避免死循环 System.out.println("无效的整数输入"); scnr.next(); } } scnr.close(); } }
关键修改点
- 用
scnr.hasNext()作为循环外层判断,确保仅当输入流有数据时才继续执行。 - 读取
inputString后立即判断是否为"Stop",是则直接跳出循环,避免后续无效的整数读取操作。 - 读取整数前用
scnr.hasNextInt()检查,防止输入非整数或无输入时触发异常。 - 添加无效输入处理逻辑,避免程序陷入死循环。
内容的提问来源于stack exchange,提问作者garcGut
相关产品推荐
相关产品推荐

