2016-05-13 21 views
1

ネストされたtryブロックからcatchブロックまたはfinallyブロックを削除し、外側のcatchブロックが例外を処理するようにしても問題ありませんか?catchブロックまたはfinallyブロックがないネストされたtryブロック

ような何か:

try (Connection con = ds.getConnection(); 
    PreparedStatement ps = con.prepareStatement(sql);) { 

    //nested try block without a catch or finally block 
    try (ResultSet rs = ps.executeQuery();) { 
     while (rs.next()) { 
      list.add(rs.getInt("id")); 
     } 
    } 
} catch (SQLException e) { 
    e.printStackTrace(); 
} 
+0

sr.Varoa @ここに私の質問は、それがコンパイルされているか否かとは関係ありません。それは確かにコンパイルする。私の質問は、ネストされたtryブロックのcatchブロックを宣言しないというプログラミングの習慣に従うことです。このアプローチでは、プログラムはコンパイルされて正常に動作します。 –

答えて

0

あなたは、結果セットが自動的に閉じません「してみてください」を削除した場合。

リソースのtry-with文は、隠されたfinallyでrs.closeを実行します。

オープンResultSetが問題につながることができ、結果セットを閉じることをお勧めです:例外は、この例で引くとjava.sql.SQLException: - ORA-01000: maximum open cursors exceeded

問題は、データソースの例外、クエリの作成例外やクエリ実行のSQLExceptionを区別しない方法ですか?私はおそらく、特定のRuntimeExceptionをスローします。データソースが接続を配信できないときです。

0

No. Your code won't compile.
(さえネストされた)すべてのtryブロックcatch(..)及び/又はfinallyで従わなければなりません。

その他の追加の例外を処理する場合は、2番目のキャッチブロックを追加します。

サンプルコード:

try { 
    // code which may throw exceptions 
} catch(Exception e1) { 
    // e1 specific code 
} catch (Exception e2) { 
    // e2 specific code 
} finally { 
    // Optional. Executes whether exception thrown or not! 
} 
+0

JDK 7で正常にコンパイルされます。 –

関連する問題