通过这个(简化的)代码示例,Eclipse(Kepler SR2)为最内部的if语句(if (con != null))
发出警告,死代码。
public class DbManager {
public String getSingleString(String query) throws SQLException {
DbManager dbmgr = new DbManager();
Connection con = null;
try {
con = dbmgr.getConnection("user", "pwd", URL);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
if (con != null) {
PreparedStatement pstmt = null;
ResultSet rset = null;
pstmt = con.prepareStatement(query.toString());
rset = pstmt.executeQuery();
if (rset != null && rset.next()) {
return (rset.getString(1));
}
}
}
return null;
}
}
通常,在尝试之后的行上定义的数据库连接将创建一个连接,然后违规的if语句将为true。关于死代码的警告真的正确吗?
如果dbmgr.getConnection("user", "pwd", URL);
返回异常,则con
将永远不会被分配非null引用。
您用null初始化了con
。因此,当抛出异常并且代码到达catch时,con
将为null。这就是为什么检查(con != null)
没有意义。
如果连接成功创建,那么catch语句将永远不会被调用,因此它是死代码,请尝试将其重新排列为:
try {
con = dbmgr.getConnection("user", "pwd", URL);
//if (con != null) { <-- not required because of the try and catch
PreparedStatement pstmt = null;
ResultSet rset = null;
pstmt = con.prepareStatement(query.toString());
rset = pstmt.executeQuery();
if (rset != null && rset.next()) {
return (rset.getString(1));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
我在运行了几次代码并遇到一些问题后意识到了这个问题:catch之后缺少一个}。应该是:
try {
con = dbmgr.getConnection("cap_x1", "test");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (con != null) {
PreparedStatement pstmt = null;
ResultSet rset = null;
等等。感谢您的反馈。