2013-04-09 13 views
33

これが間違っていると私を訂正してください:Java 7のtry-with-resourcesステートメントで、リソースのclose()メソッドによってスローされた例外は、自分のメソッドによってスローされたものとして宣言されなければなりません。 close()によってスローされた例外。リソースの試用:close()メソッドの例外をスローするかキャッチする必要がありますか?

もしそうなら、私はそれを十分に活用するかどうか疑問に思います。私は確かにthrowclose()によってスローされた例外にしたくない、呼び出し元はそれで何をするか分からない。そしてtryは別のtryをラップしてclose()を処理するだけでは、少なくとも私にはあまり優雅に見えません。

EDIT:私は誤って2つの質問をしましたが、そのうちの1つは重複していました。

質問1.メソッドがclose()メソッドから例外をスローするか、try-with-resourcesを別のtryでラップすると宣言する必要がありますか? (提案された複製では答えられません)

質問2.リソースをサイレントに閉じる方法はありますか? (明らかに重複したので、私は問題外その文を取っています。うまくいけば、これは問題が十分にユニークなもの。)

+0

を実現しているあなたは、 '近い()'から投げる多くのリソースを持っていますか? –

+0

ほんの少しですが、私はそれらをたくさん使います(ResultSet、BufferedReader、RandomAccessFile)。 –

答えて

26
Java Language Specification ($14.20.3.2)から

引用:

14.20.3.2拡張のtry-と資源

のtry-と資源少なくとも一つのcatch節および/または最終的 と声明節はtry-with-resourcesステートメントと呼ばれます。 拡張のtry-と資源の文の意味:

       てみResourceSpecification
               ブロック
        キャッチオプト
        最後にオプト

に次の翻訳で与えられる基本的なのtry-と資源のtry-catch内にネスト声明 (§14.20.3.1)またはtry-finallyまたはtry-catch-finally 声明:

       試し{
               はResourceSpecification
                     を試してみてくださいブロック
       }
        キャッチOPT
        最後OPT

翻訳の効果は、ResourceSpecificationを試しに " "の内側に置くことです。これにより、拡張try-with-resourcesステートメント のcatch節が、リソースの自動初期化または終了のために例外をキャッチできます。 だから、

は、基本的には、ラッパーがすでに

18

the Java tutorial

からのtry-と-リソース文はキャッチし、finallyブロックを持つことができます通常のtry文と似ています。リソースの試行では、は、宣言されたリソースが閉じられた後にキャッチまたは最終ブロックが実行されます

(強調鉱山)

だからあなたは単にあなたが別のtry-catchブロックでのtry-と資源をラップする必要はありません、あなたは、単にキャッチを追加

try (BufferedReader br = 
       new BufferedReader(new FileReader(path))) { 
    return br.readLine(); 
} 
catch (IOException e) { 
    // handle the exception that has been thrown by readLine() OR by close(). 
} 
+0

リソースがキャッチを呼び出さない場合、&finallyブロックが存在しない場合、リソースはクローズされますか? –

+0

リンクをクリックしてください。 –

6

を行うことができますブロック:

class Foo implements AutoCloseable { 
    public void close() throws Exception { 
     throw new Exception(); 
    } 
} 

public class Try { 
    public static void main(final String[] args) { 
     try(Foo f = new Foo()) { 
      System.out.println("No op!"); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
1

適切なcatch (Exception e) { }句を追加するだけで済みます。特定のものに特化した処理が必要な場合や、必要な場合には単にExceptionを捕まえることができます。

try (Statement stmt = con.createStatement()) { 
    ResultSet rs = stmt.executeQuery(query); 

    while (rs.next()) { 
     String coffeeName = rs.getString("COF_NAME"); 
     int supplierID = rs.getInt("SUP_ID"); 
     float price = rs.getFloat("PRICE"); 

     System.out.println(coffeeName + ", " + supplierID + ", " + 
          price + ", " + sales + ", " + total); 
    } 
} catch (Exception e) { 
    System.out.println("Exception while trying to through the queries. ", e); 
} 

それはJavaの7ですので、あなたが実際にcatch節ごとに複数の例外を置くことができる、またはあなたは単にあなたが望む最も外側の例外をキャッチすることができます。

関連する問題