需要帮助来了解内部尝试捕获和外部尝试捕获 - java

我从其他开发人员那里获得了一些代码。它具有一个数据库调用,该调用具有一个内部的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(){} finally {}不需要catchfinally,只需要其中之一。它是如何工作的,当在catch中引发由try块之一处理的异常时,将调用该catch块。否则,异常会像往常一样向上传播(稍后我们将在确切的位置传播该异常)。无论是否发生异常,finally块几乎总是被调用(请查看Java规范,以了解可能很少跳过finally块的情况)。

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

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

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

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…