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

Java循环调用getInput()获取输入第二次抛出NoSuchElementException问题

崩溃根因

  • 每次调用getInput()方法都会新建绑定System.in的Scanner实例,且方法执行结束前会调用scan.close()关闭扫描器。
  • Scanner的close()方法被调用时,会同步关闭其绑定的底层输入流,System.in作为全局标准输入流一旦关闭就无法重新打开。
  • 第二次调用getInput()时,新建的Scanner尝试从已关闭的System.in中读取数据,就会抛出NoSuchElementException异常。

修复方案

方案1:全局复用Scanner实例(最优方案)

将Scanner定义为类的成员变量,仅初始化一次,全程复用,不需要在每次获取输入时新建实例,也不需要在getInput()方法内关闭:

  1. 类中新增成员变量:
// 全局共用同一个Scanner实例
private Scanner inputScanner = new Scanner(System.in);
  1. 改造后的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);
}
  1. 整个程序所有输入逻辑全部执行完毕后,再统一调用inputScanner.close()释放资源即可。

方案2:移除关闭逻辑(快速修复)

如果不需要做结构调整,直接删除getInput()方法中的scan.close()代码行即可解决崩溃问题,仅会产生可忽略的少量对象创建开销,适合小型测试程序使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:24:07