You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java运行代码提示Resource leak: 'yourName' is never closed如何解决?

报错原因

这个提示是VS Code的静态代码检查触发的规则:Scanner属于IO资源类,实例创建占用系统资源后如果没有主动释放,会引发资源泄漏问题,因此代码检查工具给出了告警。

解决方案

下面提供三种适配不同场景的解决方法:

  • 方法1:手动调用close()方法释放资源
    适合当前这种仅单次使用Scanner、用完后没有其他输入操作的简单场景,在Scanner使用完成后添加关闭逻辑即可,修改后完整代码如下:

    import java.util.*;
    public class PrintName {
        public static void main(String[] args) {
            // Prints your name
            System.out.print("What is your name? ");
            Scanner yourName = new Scanner(System.in);
            System.out.println("Your name is: " + yourName.next());
            // 新增关闭资源的代码
            yourName.close();
        }
    }
    

    注意:关闭包装了System.in的Scanner会同时关闭System.in流,如果后续代码还有从控制台读输入的需求,不要使用该方法

  • 方法2:使用try-with-resources语法自动关闭资源
    Java 7及以上版本支持该语法,被定义在try后面括号中的资源会在代码块执行结束后自动释放,无需手动编写关闭逻辑,是更安全的写法:

    import java.util.*;
    public class PrintName {
        public static void main(String[] args) {
            // Prints your name
            System.out.print("What is your name? ");
            // 将Scanner定义在try括号中,自动释放
            try(Scanner yourName = new Scanner(System.in)){
                System.out.println("Your name is: " + yourName.next());
            }
        }
    }
    
  • 方法3:全局复用同一个Scanner实例
    如果项目中多处需要读取控制台输入,可以将Scanner声明为全局静态常量,整个程序运行周期内复用同一个实例,不会重复占用资源也不会触发资源泄漏告警:

    import java.util.*;
    public class PrintName {
        // 全局静态Scanner实例
        private static final Scanner SCANNER = new Scanner(System.in);
        public static void main(String[] args) {
            // Prints your name
            System.out.print("What is your name? ");
            System.out.println("Your name is: " + SCANNER.next());
        }
    }
    

内容的提问来源于stack exchange,提问作者Siriki Lohit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:42:02