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/