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
相关产品推荐
相关产品推荐

