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
相关产品推荐
相关产品推荐

