Java使用Scanner时多处出现Resource leaked资源泄露报错如何解决
资源泄露报错
Resource leaked解决方案 - 该报错通常是IDE静态检测到实现了
Closeable/AutoCloseable接口的非内存资源类对象(文件流、数据库连接、网络套接字、Native包装类等)未被正确释放触发,普通内存变量不会触发该报错,可先确认myFirstname、myObj的实际类型是否属于上述资源类。 - 优先使用try-with-resources语法(Java 7+、C# 8+等主流语言版本均支持类似语法),资源会在代码块执行完毕后自动释放,无需手动调用关闭方法,Java示例如下:
// 错误写法:资源使用后未主动关闭,触发泄露警告 FileReader myFirstname = new FileReader("user-info.txt"); CustomResource myObj = new CustomResource(); // 业务逻辑
// 正确写法:try-with-resources自动管理资源释放 try (FileReader myFirstname = new FileReader("user-info.txt"); CustomResource myObj = new CustomResource()) { // 业务逻辑 } catch (IOException e) { // 异常处理逻辑 }
- 若使用不支持自动资源管理的旧版本语言,需在
finally代码块中手动关闭资源,注意添加空指针判断避免异常:
FileReader myFirstname = null; CustomResource myObj = null; try { myFirstname = new FileReader("user-info.txt"); myObj = new CustomResource(); // 业务逻辑 } catch (IOException e) { // 异常处理 } finally { if (myObj != null) { try { myObj.close(); } catch (IOException e) { // 资源关闭异常处理 } } if (myFirstname != null) { try { myFirstname.close(); } catch (IOException e) { // 资源关闭异常处理 } } }
- 如果确认变量为普通字符串、POJO等非资源类型仍触发报错,属于IDE静态检测规则误报,可在对应代码行前添加对应注解抑制警告(Java中为
@SuppressWarnings("resource")),或重置IDE的代码检测规则。
注意:仅在100%确认不存在资源泄露风险时再使用警告抑制方案,避免实际泄露导致的程序运行卡顿、资源耗尽问题。
内容的提问来源于stack exchange,提问作者Freedom
相关产品推荐
相关产品推荐

