我收到了另一位开发人员从我这里传递过来的一些代码。它有一个数据库调用,该调用有一个不带 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 {}
不需要同时使用 catch
和 finally
,而只需要其中之一。它是如何工作的,当由 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/