资源警告java

资源警告java,java,eclipse,resources,io,memory-leaks,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;

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块中丢弃IOException,而应该记录它并继续(就像您当前所做的那样)。当清理代码抛出异常时,会出现一些奇怪的错误,而认真地记录日志将为您节省极其痛苦的调试会话

  • 对于这样的演示,打印堆栈跟踪是可以的,但通常您应该记录它,并且只向stderr打印一条简短的错误消息。用户看到stacktraces时会感到恐慌,即使是良性的


  • 除此之外,代码在我看来很好,上面的任何一个都不表明存在资源泄漏。

    当您抛出新的
    运行时异常时,您将立即被引导到
    捕获块,而没有机会关闭
    FileWriter
    。如果引发
    运行时异常
    ,则需要关闭
    文件编写器

    public static void main(String[] arg) {
        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);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (f != null) {
                    f.close();
                }
            } catch (Exception ignore) {
            }
        }
    }
    

    我想我知道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(…)
    失败的事情;e、 g.我们可能已经使用
    System.setErr(…)
    将正常的
    System.err
    实例替换为某个自定义
    PrintWriter
    子类的实例,该子类在每个月的第二个星期二抛出一个未经检查的异常


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

    确切的错误消息是什么?资源泄漏:“f”在此位置未关闭相反,他在Try/catch语句中使用Try/finally语句。因此文件将被关闭。没有资源泄漏;而且,在一个非常重要的示例中,与您的建议相比,让文件清理更接近文件使用情况是一个非常重要的优势。这是一个可读性很好的示例,带有嵌套try的OP让我们觉得有点难看