Java尝试捕获并最终。如果发生异常,最终仍会保留引用?

时间:2015-07-21 10:42:40

标签: java

代码:

  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说不,但我不确定强化是否正确。

3 个答案:

答案 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)

The finally Block

  

当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