0

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

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

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

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

4 回答 4

9

这是因为close()方法:

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

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

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

基本上,你需要做类似的事情

finally
{
    try {
        stmt.close();
    } catch (SQLException sqle) {
        // log the statement-close exception
    }

    try {
        dbConn.close();
    } catch (SQLException sqle) {
        // log the connection-close exception
    }
}
于 2010-08-11T18:46:08.740 回答
4

放入dbConn = getConnection();部分try它也可以抛出一个SQLException

于 2010-08-11T18:46:24.617 回答
2

除了编译器错误之外,此代码将在运行时失败。

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

的范围和生命周期ResultSet不能比其父级ConnectionStatement.

于 2010-08-11T18:54:36.593 回答
0

您编写的代码使用了一个类,该类具有必须处理的异常类型。您可以通过以下两种方式之一来做到这一点,通过将其传递到链上,即重新抛出异常,或者通过将 close 方法放在 finally 中自己的 try catch 中来实际处理它堵塞。

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

于 2010-08-11T19:07:16.870 回答