解决Java Scanner类触发的java.util.NoSuchElementException运行时错误求助
解决Java Scanner类触发的java.util.NoSuchElementException运行时错误求助
嘿,我来帮你排查这个运行时错误的问题!你遇到的java.util.NoSuchElementException是Scanner类在尝试读取下一个整数,但输入流里已经没有更多数据可以读取时抛出的。本地IntelliJ运行正常但Hyperskill报错,大概率是在线评测系统的输入处理逻辑和本地手动输入的场景有差异。
问题根源
你的代码里直接调用scanner.nextInt()读取数据,没有先检查输入流中是否还有可用的整数。在本地手动输入时,你会严格按照需求输入完12个数字,Scanner可以正常读取;但在线评测系统通常是一次性将所有测试数据写入输入流后就关闭流,这时候如果代码没有判断就直接读取,当流中没有剩余数据时就会触发异常。
修复方案
在每次调用scanner.nextInt()之前,先调用scanner.hasNextInt()来确认输入流中还有可用的整数。修改你的输入读取循环即可:
原来的读取代码:
for (int i = 0; i < twoDimArray.length; i++) { for (int j = 0; j < twoDimArray[i].length; j++) { twoDimArray[i][j] = scanner.nextInt(); } }
修改后的代码:
for (int i = 0; i < twoDimArray.length; i++) { for (int j = 0; j < twoDimArray[i].length; j++) { // 先检查是否还有整数可读,避免抛出NoSuchElementException if (scanner.hasNextInt()) { twoDimArray[i][j] = scanner.nextInt(); } else { // 这里可以处理输入不足的情况,比如赋值默认值 twoDimArray[i][j] = 0; } } }
额外说明
这个修改既不会影响本地运行的逻辑(手动输入时hasNextInt()会等待你输入数据),又能适配在线评测系统的输入流处理方式,彻底避免触发NoSuchElementException。另外,Hyperskill的测试用例应该是符合要求的输入,所以else分支的逻辑大概率不会被触发,只是做一个兜底处理。
备注:内容来源于stack exchange,提问作者Nibowaka
相关产品推荐
相关产品推荐

