Java方法内操作ArrayList时出现NoSuchElementException报错原因求解
错误原因说明
这个错误和你将逻辑写在类方法中没有任何关系,核心问题出在Scanner的资源关闭逻辑上:
- 当你调用
Scanner.close()方法时,如果当前Scanner绑定的是标准输入流System.in,该方法会同时将System.in也关闭,且System.in一旦关闭后无法重新打开。你在setMaxPlayers()方法中读取完最大玩家数后直接执行了sc.close(),此时System.in已经被彻底关闭。 - 后续执行
setPlayers()方法时,你新创建的Scanner尝试绑定已经关闭的System.in读取输入,调用sc.next()时无法获取到任何输入内容,就会抛出NoSuchElementException异常。
你把for循环放到单独测试类的main方法中可以正常运行,是因为这种场景下你没有提前关闭System.in,全程只有一个Scanner实例工作,不会触发流被提前关闭的问题。
修复方案
你可以选择两种方式修复问题:
- 全局共用同一个Scanner实例:不要在每个方法里单独创建Scanner,你可以把Scanner设置为Player类的成员变量,或者在Main方法中创建后传入两个调用方法中,等程序所有输入操作全部完成后再关闭Scanner。
- 不对绑定
System.in的Scanner执行关闭操作:小型项目中你可以直接去掉sc.close()这行代码,程序运行结束后JVM会自动回收相关资源,不会造成异常。
内容的提问来源于stack exchange,提问作者gtgray
相关产品推荐
相关产品推荐

