3

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();
        }
    }
}
4

3 回答 3

2

我想我知道 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

于 2013-02-15T03:12:39.663 回答
1

不,您那里没有资源泄漏。我不知道eclipse在抱怨什么。

我对您的代码的唯一评论是:

  1. 如果您在关键字和左/右大括号之间包含空格,则会更容易阅读。

  2. 您不应该在 finally 块中丢弃 IOException,而应该记录它并继续(就像您目前所做的那样)。当清理代码抛出异常时会发生奇怪的错误,并且认真地记录会为您节省极其痛苦的调试会话。

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

除此之外,代码对我来说看起来不错,以上都没有表明资源泄漏。

于 2013-02-15T02:38:52.103 回答
1

当你扔一个新的RuntimeException时,你会立即被带到catch街区而没有机会关闭你的FileWriter。在抛出FileWritera 的情况下,您需要关闭您的。RuntimeException

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) {
        }
    }
}
于 2013-02-15T02:40:41.490 回答