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

Java Scanner输入循环首次运行正常后抛出NoSuchElement异常问题咨询

问题根本原因

你在primeChecker方法末尾执行的scan.close()是导致报错的核心原因:

  • Scanner关联的System.in是JVM全局共享的标准输入流,调用close()方法关闭Scanner时,会同步关闭底层绑定的System.in流
  • 第一次循环执行完primeChecker后System.in已经被永久关闭,后续循环再新建Scanner对象绑定System.in时,流已经处于关闭状态,无法读取任何输入,直接抛出NoSuchElementException
  • 你之前尝试的hasNext()、hasNextInt()判断不生效也是同理:关闭的流默认没有可读取元素,判断条件永远返回false
修复方案

调整Scanner的实例化和关闭逻辑,全程只实例化一次Scanner,程序完全退出前不要关闭关联System.in的Scanner即可,修改后参考代码如下:

public class PrimeCheckDemo {
    // 全局只实例化一次Scanner,不要放在循环或者primeChecker方法里
    private static Scanner scan = new Scanner(System.in);

    public static boolean isPrime(int num) {
        if (num <= 1) return false;
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (num % i == 0) return false;
        }
        return true;
    }

    public static void primeChecker() 
    { 
          System.out.print("Please enter a number: ");
          int number = scan.nextInt();
          if (isPrime(number)) {
            System.out.println(number + " is prime");
          }
          else {
            System.out.println(number + " is not prime");
          }
          // 去掉原有scan.close()调用
    }

    public static void main(String[] args) 
    {
        int y=1;
        while(y!=0)
        {
          primeChecker();
        }
        // 程序完全退出前如果有需要可以在此处关闭Scanner
        scan.close();
    }
}

如果不想使用全局变量,也可以在main方法中实例化Scanner,作为参数传递给primeChecker方法,效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 01:45:01