Java中Scanner.hasNextInt()二次调用不等待输入报NoSuchElementException问题
Java Scanner二次调用读取输入失败问题修复
错误根因
问题核心来自方法末尾的sc.close()调用:
- Scanner执行
close()时会连带关闭底层绑定的输入流,此处绑定的是JVM全局唯一的System.in标准输入流 - 第一次方法调用结束后
System.in被永久关闭,第二次调用时即便重新实例化Scanner,也无法从已关闭的流中读取内容,hasNextInt()会直接返回false,调用next()就会抛出NoSuchElementException异常
修复方案
方案1:全局复用Scanner实例(推荐)
全局仅实例化一次Scanner,不要在业务方法内执行关闭操作,程序完全退出前再统一关闭:
// 类全局静态Scanner,仅初始化一次 private static final Scanner GLOBAL_SCANNER = new Scanner(System.in); public static int getInput() { int input; do { System.out.println("Please enter a number [0-200]!"); while (!GLOBAL_SCANNER.hasNextInt()) { System.out.println("That's not a number!"); GLOBAL_SCANNER.next(); } input = GLOBAL_SCANNER.nextInt(); } while (input < 0 || input > 200); return input; } // 整个程序所有输入逻辑都执行完毕后,再调用GLOBAL_SCANNER.close()释放资源
方案2:轻量修改
如果不想调整原有代码结构,直接删除方法末尾的sc.close()调用即可。System.in会在JVM进程退出时自动回收,不会产生资源泄漏问题。
额外逻辑修正
原有代码的循环条件写反,若需求是获取[0,200]区间的合法整数,需要将do-while的判断条件修改为:
} while (input < 0 || input > 200);
原逻辑下输入合法区间的数值会触发循环要求重新输入,仅输入区间外的数值才会返回,和预期功能不符。
内容的提问来源于stack exchange,提问作者brandy29
相关产品推荐
相关产品推荐

