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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 21:09:02