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

Scanner NoSuchElementException的成因与解决方法及Java代码异常咨询

Scanner的NoSuchElementException成因与修复方案

别担心,第一次用Java Scanner遇到这个异常太正常了,我来帮你理清问题出在哪,以及怎么解决~

一、异常的常见成因

这个异常本质上是Scanner尝试读取输入,但找不到可用的输入元素,常见原因有两个:

  • 输入流被提前关闭:System.in是全局的标准输入流,如果你之前在程序里创建过其他Scanner实例并调用了close(),那这个流会被彻底关闭,后续所有基于System.in的Scanner都无法读取输入,直接抛出异常。哪怕你自己的代码里只创建了这一个Scanner,要是在某些场景下(比如IDE运行的特殊配置)流被意外关闭,也会出问题。
  • 没有可用输入就尝试读取:如果程序运行时,控制台没有提供任何输入(比如你还没输入内容,程序就执行到了nextLine()),或者输入流已经到了末尾,Scanner也会抛出这个异常。

看你的代码,虽然你只创建了一个Scanner,但如果你的程序还有其他部分(哪怕是之前测试的代码)关闭过System.in,那当前的Scanner就会因为流不可用而报错;另外,也有可能是IDE的控制台输入没有正确响应,导致Scanner读不到内容。

二、针对你代码的修复方法

1. 不要随意关闭Scanner(关键!)

Scanner的close()方法会连带关闭System.in,而这个流一旦关闭就无法重新打开。所以除非你的程序完全结束,不再需要任何输入,否则不要调用close()。修改后的代码:

Scanner newName = new Scanner(System.in);
System.out.println("Δωστε ονομα : ");
String getOnoma = newName.nextLine(); // 现在应该能正常读取了

// 不要在这里关闭!如果之后还要用输入,留到程序最后再关闭
// newName.close();

2. 读取前先检查是否有可用输入

为了更稳妥,可以在读取前用hasNextLine()判断是否有输入可读,避免直接读取抛出异常:

Scanner newName = new Scanner(System.in);
System.out.println("Δωστε ονομα : ");

if (newName.hasNextLine()) {
    String getOnoma = newName.nextLine();
    System.out.println("你输入的名字是:" + getOnoma); // 可以添加测试输出验证
} else {
    System.out.println("没有获取到输入,请检查控制台是否正常工作~");
}

// 非必要不关闭
// newName.close();

3. 检查IDE运行配置

如果上面的方法还是不行,看看你的IDE(比如IntelliJ、Eclipse)的运行配置:确保控制台允许输入,有些情况下IDE的“运行”设置里可能禁用了控制台输入,或者没有正确关联输入流,调整后再试试。

额外小提示

如果你的程序需要多次读取输入,建议整个程序只创建一个Scanner实例,复用它就好,这样能避免多次创建/关闭导致的流问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:01:43