资源警告java
Eclipse(Juno)说,在这个示例中有一个资源泄漏警告。 这有效吗?资源警告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;
当异常引发点位于
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在抱怨什么 我对您的代码的唯一意见是:
除此之外,代码在我看来很好,上面的任何一个都不表明存在资源泄漏。当您抛出新的
运行时异常时,您将立即被引导到捕获块,而没有机会关闭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让我们觉得有点难看