Java中while循环调用.next()部分环境报NoSuchElementException问题
问题根因
- 你当前代码使用
while(true)死循环无限调用keyboard.next()读取输入,未做输入流可用性判断。线上编程平台的测试输入都是预先固定的,当所有输入内容读取完毕后,输入流处于EOF结束状态,此时再调用next()就会直接抛出NoSuchElementException,本地运行时你可以持续手动输入内容,所以不会触发该异常。 - 另外如果在代码其他位置提前关闭了
Scanner,会连带关闭System.in输入流,后续读取输入也会触发同类异常,你当前提交的代码未出现提前关闭的问题,核心原因是无限制循环读取输入。
修复方案
import java.util.Scanner; public class example1 { public static void main(String[] args) { System.out.println("Enter an ending value"); Scanner keyboard = new Scanner(System.in); // 新增输入可用性判断,避免第一步读取整数就报错 if (!keyboard.hasNextInt()) { keyboard.close(); return; } int input = keyboard.nextInt(); // 把死循环改为有输入才执行的逻辑,输入流结束自动退出 while(keyboard.hasNext()){ System.out.println("Count up or down?"); String command = keyboard.next(); // 新增退出指令,手动运行时输入exit即可结束程序 if (command.equalsIgnoreCase("exit")) { break; } if (command.equalsIgnoreCase("up")) { int one = 1; int ten = 11; int hund = 101; while (one <= input) { System.out.printf("%5d %4d %4d\n", one, ten, hund); one++; ten++; hund++; } } else if (command.equalsIgnoreCase("down")) { int neg = -input; int one = -1; int ten = 9; int hund = 99; while (one >= neg) { System.out.printf("%5d %4d %4d\n", one, ten, hund); one--; ten--; hund--; } } } // 仅在程序完全结束前关闭Scanner,避免提前关闭导致System.in被回收 keyboard.close(); } }
修复说明
- 每次读取输入前调用
hasNext()/hasNextInt()判断输入流是否还有可用内容,输入耗尽时自动退出循环,不会触发读空异常 - 新增
exit退出指令,满足本地手动运行时的退出需求 - 把两个并列的
if判断改为else if,减少不必要的逻辑校验 - 统一在程序结束前关闭
Scanner,避免提前关闭导致后续无法读取输入
内容的提问来源于stack exchange,提问作者deadlight446
相关产品推荐
相关产品推荐

