代码:
try {
dbConnection = jdbcTemplate.getDataSource().getConnection();
callableStatement = dbConnection.prepareCall(getDBUSERCursorSql);
}
catch (SQLException e) {
LOGGER.error("Error occured", e);
}
finally
{
if (dbConnection != null && !dbConnection.isClosed()) {
dbConnection.close();
}
}
因此,如果行中出现异常,则调用callableStatement = dbConnection.prepareCall(getDBUSERCursorSql);并且catch块执行,对dbConnection
的引用是否仍然存在于finally块中? Fortify说不,但我不确定强化是否正确。
答案 0 :(得分:2)
如果在try块之前声明dbConnection
变量,它将在finally块中可用。现在,它的值是否为null取决于try块的代码。如果唯一可以抛出异常的代码是dbConnection = jdbcTemplate.getDataSource().getConnection();
行,那么如果该行抛出异常,它可能为null。
例如,以下代码有效:
Connection dbConnection = null;
try {
dbConnection = jdbcTemplate.getDataSource().getConnection();
callableStatement = dbConnection.prepareCall(getDBUSERCursorSql);
}
catch (SQLException e) {
LOGGER.error("Error occured", e);
}
finally
{
if (dbConnection != null && !dbConnection.isClosed()) {
dbConnection.close();
}
}
另一方面,如果在try块中声明dbConnection
,则代码将不会通过编译。
编辑:
如果callableStatement = dbConnection.prepareCall(getDBUSERCursorSql);
抛出异常,则finally块将引用dbConnection
引用的Connection实例,并且能够关闭连接。
答案 1 :(得分:1)
当try块退出时,finally块始终执行。这个 确保即使意外发生也执行finally块 异常发生。
所以,是的。如果dbConnection
块在前一个try
块中没有丢失其范围,则对resourcePackageName
的引用仍然存在于finally块中。
答案 2 :(得分:1)
谢谢你们。是的,终于有了参考。我想我应该在第一时间自己尝试以下
public static void main(String[] args) {
String msg ="StringIsNotNull";
printThis(msg);
}
private static void printThis(String msg){
try{
System.out.println(msg);
throw new Exception();
}
catch (Exception e){
System.out.println(e);
}
finally{
System.out.println(msg);
msg=null;
}
}
当我运行上述内容时,我得到了以下内容
StringIsNotNull
java.lang.Exception的
StringIsNotNull