2013-02-13 80 views
14

Eclipse我收到警告Resource leak: 'ps' is not closed at this location,我不明白。eclipse中的资源泄漏警告

在我的Java代码中,我声明“ps”作为预备声明,我多次使用(并关闭)它。然后,我有以下顺序:

try { 
    if(condition) { 
     ps = c.prepareStatement("UPDATE 1 ..."); 
    } else { 
     ps = c.prepareStatement("UPDATE 2 ..."); 
    } 
    ps.executeUpdate(); 
} catch (SQLException e) { 
    // exception handling 
} finally { 
    if (null != ps) 
     try { 
      ps.close(); 
     } catch (SQLException e) { 
      // exception handling 
     }; 
} 

“资源泄漏” - 警告出现在“更新” - 其他部分中的语句。 如果我在启动try块之前设置了ps = null,则没有警告。

如果第二个UPDATE语句被注释掉,则不会显示警告。

这是理解还是java/eclipse问题?

+1

我的猜测是Eclipse正在检测到您之前使用了预准备语句对象,并且由于潜在的SQLException可能无法正确关闭它。如果你在finally块中执行'ps = null;'它可能会被修复,这将是一个更合理的清理它的地方。 – 2013-02-13 20:58:02

回答

3

我认为,这是您使用的检查器的问题。

将代码分解为initializationuse块。此外,抛出初始化块的异常(或做一个提前返回)。这样,就没有必要检查空当你释放资源后use

// initialization 
// Note that ps is declared final. 
// I think it will help to silence your checker 
final PreparedStatement ps; 

try { 
    if(bedingungen ...) { 
     ps = c.prepareStatement("UPDATE 1 ..."); 
    } else { 
     ps = c.prepareStatement("UPDATE 2 ..."); 
    } 
} 
catch (SQLException e) { 
    log.error("Problem creating prepared statement, e); 
    throw e; 
} 

// use 
try { 
    ps.executeUpdate(); 
} catch (SQLException e) { 
    log.error("Problem decrementing palets on " + srcElement.getName() + 
     ": " + e.getMessage()); 
} 
finally { 
    try { 
     ps.close(); 
    } catch (SQLException e) { 
     log.warn("Error closing PreparedStatement: " + e.getMessage()); 
    }; 
} 
+0

我会试试... – 2013-02-13 21:04:55

10

如果您使用的是Java 7。在这种情况下,这个警告,您不应该关闭实现AutoClosable自己的资源。你应该在statementcommented的try特殊的初始化部分初始化这些资源:

// decide which update statement you need: 
// (your if should be here) 
String update = ....; 
try (
    ps = c.prepareStatement(update); 
) { 
    // use prepared statement here. 
} catch (SQLException) { 
    // log your exception 
    throw new RuntimeException(e); 
} 
// no finally block is needed. The resource will be closed automatically. 

我确实不知道为什么if/else声明的存在导致出现或消失的警告。但是,Java 7推荐使用我上面描述的可自动关闭的资源,所以试试这个。

+0

谢谢,这帮了我。由于我还没有准备好完全承诺Java 7,我只是告诉Eclipse将资源泄漏设置为忽略。可能很危险,但现在可以工作。 – rjcarr 2013-02-27 22:02:23

-4

将变量名称从c更改为mC。我认为这是一个奇怪的小故障,而使用c作为变量名称。谢谢Charlie