Java循环内需用户输入时如何正确关闭Scanner?
Java循环内使用Scanner的关闭问题解析
你的代码里while(true)是无限循环,没有任何终止逻辑,导致后续的scan.close()永远无法执行,这就是编译器提示“不可达代码”的原因。下面针对你的疑问逐一解答:
1. 不要将Scanner移至循环内每次迭代关闭
Scanner绑定System.in(标准输入流)时,关闭Scanner会同时关闭System.in。如果在循环内每次创建并关闭Scanner,第一次关闭后System.in就被关闭了,后续再创建Scanner读取输入会直接抛出NoSuchElementException,完全无法正常工作。这种做法绝对不可取。
2. 是否必须关闭Scanner?
分两种情况看待:
- 若Scanner绑定的是文件、网络连接这类外部资源,必须手动关闭,否则会造成资源泄漏。
- 若Scanner绑定的是
System.in,则无需刻意关闭:System.in由JVM管理,程序退出时会自动回收;且一旦关闭System.in,整个程序后续都无法再读取控制台输入。除非你明确知道程序后续不再需要输入,否则没必要调用scan.close()。
修正后的示例代码
给循环添加终止条件,让scan.close()可以正常执行:
public void closeScanner(){ Scanner scan = new Scanner(System.in); while (true) { System.out.println("Please enter something (enter 'exit' to quit):"); String someThing = scan.nextLine(); // 设置终止条件,输入"exit"时退出循环 if ("exit".equals(someThing)) { break; } // 执行其他业务逻辑 System.out.println("You input: " + someThing); } // 循环正常退出后,可选择关闭Scanner(非必须) scan.close(); }
内容的提问来源于stack exchange,提问作者Derek
相关产品推荐
相关产品推荐

