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

作成したコードは、処理する必要がある種類の例外を持つクラスを使用しています。それをチェーンに渡す、つまり例外を再スローする、または他のコメントのいくつかが示すように、最後に独自の try キャッチに close メソッドを配置して実際に処理するという 2 つの方法のいずれかでそれを行うことができます。ブロック。

通常、これらは、オブジェクトまたはストリームを常に閉じて、有効な状態のままにしておく必要があるファイル IO クラスで見られます。そうしないと、オペレーティング システムにクリーンアップを任せることになります。

于 2010-08-11T19:07:16.870 に答える