如何在该Java数字反转与回文判断程序中关闭Scanner对象?
报错本质
你在new Scanner(System.in)所在行看到的提示,根本不是Java语法层面的编译错误,是IDE静态检查触发的资源泄漏告警:Scanner实现了Closeable资源接口,未显式编写资源释放逻辑时,工具就会在这一行标注提示,和Scanner本身的创建语法没有关系。
正确调用close完成资源关闭的实现方案
方案1:手动调用close方法(兼容所有Java版本)
- 绝对不能在创建Scanner之后立刻调用
s.close(),否则后续执行s.nextInt()读取控制台输入时,会直接抛出NoSuchElementException——因为Scanner绑定的是全局System.in流,一旦被关闭,后续就没法读数据了。 - 正确的时机是把
s.close()放在所有依赖Scanner的输入、业务逻辑全部执行完成之后,也就是原代码的回文判断逻辑跑完的最后一行补上调用,就能消除告警。
方案2:try-with-resources 自动资源管理(Java 7+ 官方推荐写法)
- 这种写法不需要手动写close调用,只要把Scanner的创建语句放到
try关键字后的圆括号内,JVM会在代码块执行完成后自动调用close方法释放资源;哪怕中间代码抛出运行时异常,也会保证资源正常释放,完全不会出现漏关的问题,是目前最规范的资源管理写法。
修正后的完整可运行代码(推荐写法)
import java.util.Scanner; public class Reverse { public static void main(String[] args) { int rev = 0, rem; // try后的括号内声明的资源会被JVM自动关闭,无需手动调用close try (Scanner s = new Scanner(System.in)) { System.out.println("Enter a number "); int a = s.nextInt(); int b = a; while (b != 0) { rem = b % 10; rev = rev * 10 + rem; b = b / 10; } System.out.println("The reverse of the number is " + rev); if (a == rev) { System.out.println("The number is Palindrome."); } else { System.out.println("The number is not Palindrome"); } } } }
特殊注意事项:由于本例中Scanner绑定的是全局
System.in标准输入流,调用close方法会直接关闭这个全局流。在当前这个单输入的简单程序里,这种关闭行为不会产生任何副作用;但如果后续扩展功能需要多次通过控制台读取输入,就一定要避免提前关闭Scanner,否则整个JVM运行周期内都没法再读取控制台输入了。
内容的提问来源于stack exchange,提问作者Sauhard Chand
相关产品推荐
相关产品推荐

