java - 需要帮助理解内部 try catch 和外部 try catch

标签 java

我收到了另一位开发人员从我这里传递过来的一些代码。它有一个数据库调用,该调用有一个不带 catch 的内部 try block ,然后是一个带 catch 的外部 try block 。

我需要一些帮助来理解它的含义。因为内部 try block 上没有捕获,这是否意味着数据库层中的任何异常都将被忽略?是否有外部 try catch block 仅捕获 getConnection 和 closeStatement 的错误?

感谢您对此的帮助。

public int doKeywordSearch (
    String username,
    String sessionId,
    String[] keywords, 
    String status) throws RetekServiceException {

    int totalRecords = 0;
    Connection connection = null;
    CallableStatement callStmt = null;
    try {
        connection = DaoUtils.getDataSource().getConnection();      
        try {   
            callStmt = connection.prepareCall(DaoConstants.ITEM_SEARCH_KEYWORD_SQL);
            callStmt.setString(1, username);                                                    // p_vUsername
            callStmt.setString(2, sessionId);                                                   // p_vSid
            callStmt.setString(3, StringUtils.clean(keywords.length > 0 ? keywords[0] : null)); // p_vKeyword1 
            callStmt.setString(4, StringUtils.clean(keywords.length > 1 ? keywords[1] : null)); // p_vKeyword2
            callStmt.setString(5, StringUtils.clean(keywords.length > 2 ? keywords[2] : null)); // p_vKeyword3 
            callStmt.setString(6, StringUtils.clean(keywords.length > 3 ? keywords[3] : null)); // p_vKeyword4
            callStmt.setString(7, StringUtils.clean(keywords.length > 4 ? keywords[4] : null)); // p_vKeyword5
            callStmt.setString(8, status);                                                      // p_vStatus
            callStmt.registerOutParameter(9, OracleTypes.INTEGER);              
            callStmt.execute();
            totalRecords = callStmt.getInt(9);
            connection.commit();
        }
        finally {
            DaoUtils.closeStatement(callStmt);
        }
    }
    catch(SQLException e) {
        DaoUtils.doRollback(connection, e);
    }
    catch(NamingException e) {          
        throw new RetekServiceException("Could not do keyword search.", e);
    }
    finally {
        DaoUtils.closeConnection(connection);
    }                   
    return totalRecords;
}

最佳答案

try{} catch(){} finally {} 不需要同时使用 catchfinally,而只需要其中之一。它是如何工作的,当由 catch block 之一处理的异常被抛出到 try 内时,就会调用该 catch block 。否则,异常将像往常一样向上传播(它到底在哪里传播,我将在一分钟内解释)。无论是否发生异常,finally block 几乎总是被调用(请检查 Java 规范,以了解可能会跳过 finally block 的极少数情况)。

如果在 inner try block 中发生异常,并且没有 catch 子句可以处理该异常,则 outer try/catch 将尝试使用 outer try/catch 的适当 catch 子句来处理它,否则如果 outer try/catch 中不存在这样的 catch 子句,则异常将向上传播(到调用此方法的方法)或者一直到 JVM)。

其实上面的例子没有多大意义,你也可以将语句放在外部的finally block 中...

另外,正如其他人指出的,如果您使用的是 java7 并且您的 connection 实现了 AutoCloseable 您可以使用 try-with-resources ,将自动处理资源关闭,您无需再手动编写 finally

关于java - 需要帮助理解内部 try catch 和外部 try catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31800226/

相关文章:

java - 为 WindowBuilder 制作 sleep 方法? [Java]

java - 动画:缩放按钮以扩展到屏幕顶部

java - 如何强制应用程序为最近的应用程序列表创建缩略图(快照)?

java - 属性文件被卸载

JavaFX 将 BarChart xAxis/width 设置为大小

java - 读取无空格整数的文件 - hasNextInt() 永远不会返回 true

java - Tomcat 在启动时抛出 ClassNotFoundException

java - 不幸的是,该应用程序已停止 - LogCat 产生无数错误

java - 在代码 : "Class.forName("com. 上获取 ClassNotFoundException microsoft.sqlserver.jdbc.SqlServerDriver");"

java - 使用 Java 在 Spark 2.0 中使用数据集的 GroupByKey