gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:37:41 24 4
gpt4 key购买 nike

我收到了另一位开发人员从我这里传递过来的一些代码。它有一个数据库调用,该调用有一个不带 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com