Java循环调用getInput()获取输入第二次抛出NoSuchElementException问题
崩溃根因
- 每次调用
getInput()方法都会新建绑定System.in的Scanner实例,且方法执行结束前会调用scan.close()关闭扫描器。 Scanner的close()方法被调用时,会同步关闭其绑定的底层输入流,System.in作为全局标准输入流一旦关闭就无法重新打开。- 第二次调用
getInput()时,新建的Scanner尝试从已关闭的System.in中读取数据,就会抛出NoSuchElementException异常。
修复方案
方案1:全局复用Scanner实例(最优方案)
将Scanner定义为类的成员变量,仅初始化一次,全程复用,不需要在每次获取输入时新建实例,也不需要在getInput()方法内关闭:
- 类中新增成员变量:
// 全局共用同一个Scanner实例 private Scanner inputScanner = new Scanner(System.in);
- 改造后的
getInput()代码:
private char getInput() { String current = ""; do { current = inputScanner.next(); if(current.length() > 1) System.out.println("请输入单个字符"); else if(usedLetters.contains(current.charAt(0))) System.out.println("该字符已被使用过"); else if(!Character.isLetter(current.charAt(0)) || !Character.isLowerCase(current.charAt(0))) System.out.println("输入无效,请输入小写英文字母"); else { usedLetters.add(current.charAt(0)); break; } } while(true); return current.charAt(0); }
- 整个程序所有输入逻辑全部执行完毕后,再统一调用
inputScanner.close()释放资源即可。
方案2:移除关闭逻辑(快速修复)
如果不需要做结构调整,直接删除getInput()方法中的scan.close()代码行即可解决崩溃问题,仅会产生可忽略的少量对象创建开销,适合小型测试程序使用。
内容的提问来源于stack exchange,提问作者yftach
相关产品推荐
相关产品推荐

