java - 资源警告java

标签 java eclipse resources io memory-leaks

Eclipse(Juno) 表示此示例中存在资源泄漏警告。 这有效吗?
当异常抛出点在 for 循环中时会发生这种情况。

package kuni;

import java.io.FileWriter;
import java.util.Arrays;

public class ResourceWarn {
    public static void main(String[] args){

        try {
            FileWriter f = null;
            try{
                f = new FileWriter("test.txt");
                for(String s : Arrays.asList("a","b","c")){
                    if(s.equals("c"))throw new RuntimeException("aa"); //resource leak warn here
                    f.write(s);
                }
            }finally{
                try{
                    f.close();
                }catch(Exception ignore){
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

最佳答案

我想我知道 Eclipse 在提示什么。

        } finally {
            try {
                System.err.println("closing f");
                f.close();
            } catch(Exception ignore) {
            }
        }

问题是 println !!!

Eclipse 认为 System.err.println(...) 调用可能会抛出异常。如果发生这种情况,那么 f.close() 调用就不会发生......因此,泄漏。

你我都知道这“不可能发生”......但是 Eclipse 代码分析器可能不理解 System.err 的特殊性质。

此外,我们可能在代码的其他地方做了一些导致System.err.println(...) 失败的事情;例如我们可能已经使用 System.setErr(...) 将普通的 System.err 实例替换为一些自定义 PrintWriter 子类的实例在每个月的第二个星期二抛出未经检查的异常。

尝试删除 println 或在 close 调用之后移动它。

关于java - 资源警告java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14887494/

相关文章:

java - 在java中将两个图像平铺在一起而没有空格

golang 资源所有权模式(文件、连接、可关闭)

java - 当我们允许注入(inject)时如何管理 ExecutorService 的关闭?

c# - 无法更改 .aspx 页面的区域性

java - 使用 Lucene 搜索有多少结果?

java - 在 Java Web 应用程序中重新加载资源

java - jdbc PreparedStatement 中的问号问题

java - 无法使用 Java 8 调试 JNLP

java - 一般情况下如何将 jar 文件附加到 Eclipse 中的源文件?

java - 调试 Junit 时,Eclipse 中未命中断点