Java 需要帮助了解内部试捕和外部试捕吗
我从另一个开发人员那里得到了一些代码。它有一个数据库调用,其中包含一个内部try块(不带catch),然后是一个外部try块(带catch) 我需要一些帮助来理解它的含义。因为内部try块上没有捕获,这是否意味着数据库层中的任何异常都将被忽略?是否有外部try-catch块只捕获来自getConnection和closeStatement的错误 谢谢你的帮助Java 需要帮助了解内部试捕和外部试捕吗,java,Java,我从另一个开发人员那里得到了一些代码。它有一个数据库调用,其中包含一个内部try块(不带catch),然后是一个外部try块(带catch) 我需要一些帮助来理解它的含义。因为内部try块上没有捕获,这是否意味着数据库层中的任何异常都将被忽略?是否有外部try-catch块只捕获来自getConnection和closeStatement的错误 谢谢你的帮助 public int doKeywordSearch ( String username, String sessionI
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)调用code>。内部示例是一个try
和finally
块(请注意没有catch
)。无论出现异常
,都保证调用最终
块。但是,我要推荐一个
这是另一种保证callStmt
将关闭的方法(d)
另请参见。Atry{}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)) {
// ...
}