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

Java报错Exception in thread 'main' java.util.NoSuchElementException求助

解决java.util.NoSuchElementException错误及代码修复

问题根源

你的代码抛出NoSuchElementException的核心原因是:当读取到终止符"End"时,程序仍然尝试调用scnr.nextInt()读取整数,但"End"之后没有对应的整数输入,导致Scanner找不到下一个元素而报错。此外还有两处逻辑漏洞:

  • 用input.contains(find)判断终止符不准确,若输入字符串包含"End"(比如"EndShelf")会被误判为终止
  • 循环前的初始化读取没有先检查是否为"End",若输入一开始就是"End"会直接报错

修复后的代码

import java.util.Scanner;

public class Inputkey {
    public static void main(String[] args) {
        Scanner scnr = new Scanner(System.in);

        String input;
        // 先读取第一个字符串
        input = scnr.next();
        
        // 循环条件:当输入不是"End"时继续执行
        while (!"End".equals(input)) {
            // 确认不是终止符后,再读取对应的整数
            int num = scnr.nextInt();
            
            if (num < 25) {
                System.out.println(input + ": low on stock");
            } else {
                System.out.println(input + ": well stocked");
            }
            
            // 读取下一个字符串,准备下一次循环判断
            input = scnr.next();
        }
        
        scnr.close(); // 养成关闭资源的好习惯
    }
}

关键修改说明

  • 调整读取顺序:先读取字符串并判断是否为"End",只有不是终止符时才读取对应整数,避免读到"End"时无整数可读的情况
  • 精准判断终止符:用"End".equals(input)替代contains,确保只有完全匹配"End"时才终止循环
  • 优化初始化逻辑:循环前只读取字符串,避免初始阶段就因错误读取整数报错
  • 添加资源关闭:调用scnr.close()关闭Scanner,符合Java资源管理规范

测试验证

用示例输入Bookcase 30 Hammock 2 Bed 5 End测试,输出与题目要求完全一致:

Bookcase: well stocked
Hammock: low on stock
Bed: low on stock

内容的提问来源于stack exchange,提问作者Romy Cat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:12:37