我做了一些测试(使用Windows 7,Eclipse Juno 4.2.1和Java 7 SE),发现如果一个方法没有在catch-block中显式返回,并且如果对象是在try / catch之外声明的,那么没有发出“资源泄漏”警告信号。
不会产生“资源泄漏”:
public void extISImReturnNoWarning() {
InputStream is = null;
try {
is = new FileInputStream("A");
is.available();
} catch (IOException e) {
}
}
代码中的小变化会产生“资源泄漏”:
public void locISImReturnHasWarning() {
try {
InputStream is = new FileInputStream("A");
is.available();
} catch (IOException e) {
}
}
public void extISExReturnHasWarning() {
InputStream is = null;
try {
is = new FileInputStream("A");
is.available();
} catch (IOException e) {
return;
}
}
所有方法在功能上似乎都相同 - 那么解释是什么呢?如果这是一个错误,这是Eclipse还是Java问题?
答案 0 :(得分:2)
经过一番研究,我得出的结论是这是一个Eclipse bug。我已经在Eclipse下载站点(Kepler M3)上发现的最新版本中测试了它,但问题仍然存在。我还发现了Eclipse项目过去30天内报告的类似问题的5-6个错误报告。在研究期间,我还发现了另一种奇特的行为:
public void makeConnection() throws SQLException {
Connection connection = null;
try {
connection = DriverManager.getConnection("localhost");
for (int i = 0; i < 1; i++)
if (i < 1)
throw new SQLException("Foo");
connection.commit();
} finally {
close(connection);
}
}
public void close(Connection c) {
}
此代码将生成资源泄漏警告。但是,通过删除其中一个
..资源泄漏警告将消失。奇怪的是 - 在一个vanilla案例中不会报告任何资源泄漏,您只需创建一个连接而不关闭它。
总而言之,我认为Eclipse Juno中的资源泄漏检测暂时可能有点容易出错。也许现在最好忽略Eclipse中的资源泄漏,并等待Kepler。
2014年12月更新:目前正在运行Eclipse Luna,问题仍然存在......