try-catch-finally在Java问题中抛出异常

时间:2010-08-11 18:43:55

标签: java exception try-catch-finally

我是Java初学者,但我认为在使用try-catch-finally时我不必使用throws SQLException声明异常。但是,如果我不使用它,编译器会给我错误:

  

“未报告的异常java.sql.SQLException;必须被捕获或声明被抛出”。

我包含了一个catch,所以我不确定为什么会出现这种错误。

public static ResultSet getResultSet ( String query ) 
{
    dbConn = getConnection();

    try
    {
       stmt = dbConn.createStatement( );

       ResultSet rs = stmt.executeQuery( query );

       return rs;
    }
   catch (SQLException ex)
   {
       return null;
   }
   finally
   {
       stmt.close();
       dbConn.close();
   }
}

4 个答案:

答案 0 :(得分:9)

这是因为close()方法:

stmt.close();
dbConn.close();

可能会抛出SQLException并且您没有将它们封装在try / catch块中。

一个方法很可能会在finally子句中抛出异常,并且在没有catch-clause处理这些异常的情况下,必须声明该方法抛出这些异常。

基本上,你需要做一些像

这样的事情
finally
{
    try {
        stmt.close();
    } catch (SQLException sqle) {
        // log the statement-close exception
    }

    try {
        dbConn.close();
    } catch (SQLException sqle) {
        // log the connection-close exception
    }
}

答案 1 :(得分:4)

dbConn = getConnection();放入try部分。 It can throw an SQLException too.

答案 2 :(得分:2)

除编译器错误外,此代码在运行时也会失败。

当您关闭创建Connection的{​​{1}}时,ResultSet将无效,并且对其进行的任何调用都将失败。 (当然,要实现一些奇怪的JDBC驱动程序,以便这可以工作,但这是对JDBC API的错误使用。)

ResultSet的范围和有效期不能超过其父ResultSetConnection

答案 3 :(得分:0)

您编写的代码使用的类具有必须处理的异常类型。您可以通过以下两种方式中的一种方式执行此操作:将其传递给链,即重新抛出异常,或者通过将close方法放在最终自己的try catch中来实际处理它。块。

通常,您会在文件IO类中看到这些内容,您应始终关闭对象或流以确保将其保留为有效状态。否则,您将把它留给操作系统为您清理。