You need to enable JavaScript to run this app. 如何在该Java数字反转与回文判断程序中关闭Scanner对象?
优惠活动
大模型
产品
解决方案
定价
更多

如何在该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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 15:36:03