Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要帮助了解内部试捕和外部试捕吗_Java - Fatal编程技术网

Java 需要帮助了解内部试捕和外部试捕吗

Java 需要帮助了解内部试捕和外部试捕吗,java,Java,我从另一个开发人员那里得到了一些代码。它有一个数据库调用,其中包含一个内部try块(不带catch),然后是一个外部try块(带catch) 我需要一些帮助来理解它的含义。因为内部try块上没有捕获,这是否意味着数据库层中的任何异常都将被忽略?是否有外部try-catch块只捕获来自getConnection和closeStatement的错误 谢谢你的帮助 public int doKeywordSearch ( String username, String sessionI

我从另一个开发人员那里得到了一些代码。它有一个数据库调用,其中包含一个内部try块(不带catch),然后是一个外部try块(带catch)

我需要一些帮助来理解它的含义。因为内部try块上没有捕获,这是否意味着数据库层中的任何异常都将被忽略?是否有外部try-catch块只捕获来自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块中的异常不会被忽略,它们会沿着链向上抛出到外部try/catch块(可能更高)


内部try/catch块的作用似乎是,如果try块中的任何语句失败,则确保语句关闭(在finally子句中)。

外部try块仍将捕获来自内部try块的异常。内部try块用于确保
DaoUtils.closeStatement(callStmt)

内部示例是一个
try
finally
块(请注意没有
catch
)。无论出现
异常
,都保证调用
最终
块。但是,我要推荐一个

这是另一种保证
callStmt
关闭的方法(d)

另请参见。

A
try{}catch(){}finally{}
不同时需要
catch
finally
,只需要其中一个。如何工作,当一个
catch
块处理的异常在
try
内抛出时,调用该
catch
块。否则,异常将像往常一样向上传播(我将在一分钟内解释它传播的确切位置)。无论是否发生异常,finally块几乎总是被调用的(请检查Java规范,以了解很少有可能跳过finally块的情况)

如果在内部
块中发生异常,并且没有
catch
子句可以处理异常,则外部
try/catch
将尝试使用外部
try/catch
的适当
catch
子句来处理异常,否则,如果外部
try/catch
中不存在这样的
catch
子句,则异常将向上传播(传播到调用此方法的方法或整个JVM)

实际上,上面的示例没有太大意义,您可以将语句放在外部finally块中


另外,正如其他人指出的那样,如果您使用的是java7,并且您的
连接实现了
自动关闭
,那么您可以使用
尝试使用资源
,它将自动完成资源关闭,您不必再手动编写
最后的

内部
try/finally
允许异常传递给外部
try/catch/finally
。查看更多关于如何工作的详细信息。此外,如果您使用的是Java7+,您应该查看
try (CallableStatement callStmt = connection.prepareCall(
        DaoConstants.ITEM_SEARCH_KEYWORD_SQL)) {
    // ...
}