Java使用Scanner读取输入报NoSuchElementException部分在线IDE运行异常
Java调用Scanner.nextInt()部分在线IDE报NoSuchElementException问题排查与解决
异常根因
NoSuchElementException在你的代码场景中抛出,本质是调用sc.nextInt()时,Scanner绑定的System.in输入流已经处于结束(EOF)状态,没有可用的输入内容可供读取。
- 本地VS Code运行正常:本地运行环境支持交互式输入,执行到
nextInt()时会阻塞等待用户手动输入内容,输入流不会提前结束。 - 部分在线IDE报错:这类在线IDE默认不支持运行时交互式输入,如果用户没有预先在IDE专门的「STDIN输入区」/「自定义输入区」填写好所有需要的输入内容,程序启动后
System.in会直接被标记为结束状态,调用nextInt()无内容可读就会抛出异常。 - 部分在线IDE运行成功:这类IDE默认支持运行时交互式输入,或者你测试时已经提前在输入区填写了测试用的两个整数,输入流有内容可读取。
解决方案
方案1:代码层面增加输入校验,避免异常
调用nextInt()前先通过hasNextInt()判断是否有可用的整数输入,不存在时直接给出提示而非抛出异常:
import java.util.Scanner; public class Main { public static void main(String [] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter any two numbers: "); int a,b,c; if (sc.hasNextInt()) { a = sc.nextInt(); } else { System.out.println("未获取到第一个有效整数输入"); return; } if (sc.hasNextInt()) { b = sc.nextInt(); } else { System.out.println("未获取到第二个有效整数输入"); return; } c = a + b; System.out.println("The sum = " + c); } }
方案2:在线IDE使用前适配输入规则
面试使用在线IDE前,先确认IDE的输入规则:
- 如果有单独的输入填写区域,提前将需要输入的测试数据填写到对应区域再运行代码
- 如果支持运行时交互式输入,代码运行后按照控制台提示依次输入内容即可
补充说明
你查询到的「不要调用Scanner的close()方法」是另一类同异常的触发场景:同一个JVM进程内如果创建过多个读取System.in的Scanner,前面的Scanner调用close()会顺带关闭System.in,导致后续的Scanner读取时抛出该异常,和你当前的场景并不重合。
内容的提问来源于stack exchange,提问作者Nilay Kumar
相关产品推荐
相关产品推荐

