2017-04-20 4 views
2

try-with-resourcesに続くcatchが初期化部分をカバーするかどうかは、documentationからは不明です。言い換えればtry-with-resourcesのcatchは、かっこ内のコードをカバーしていますか?

、このコードの断片を与えられた:IOExceptiongetSomeStream()をスローされた場合

try (InputStream in = getSomeStream()) { 
     System.out.println(in.read()); 
    } catch (IOException e) { 
     System.err.println("IOException: " + e.getMessage()); 
    } 

は私catchが呼び出されますか?

catchは、中括弧内のブロックのみをカバーしますか?つまり、System.out.println(in.read())

+1

「https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html 「try-with-resourcesステートメントは通常のtryステートメントのようにcatchとfinallyブロックを持つことができます。 try-with-resourcesステートメントでは、宣言されたリソースが閉じられた後にcatchまたはfinallyブロックが実行されます。 これは、キャッチブロックが通常どおり処理されることを意味します。キャッチに達する前に、リソースが後で閉じられるよう気にしないでください。 – DiabolicWords

+1

@DiabolicWords何か不足していますか?そのパラグラフにその質問に答える何かがありますか? – Michael

答えて

2

JLSから、あなたの例は、リソースを使った試行錯誤です。

少なくとも1つのcatch句および/または finally句を含むtry-with-resourcesステートメントは、拡張try-with-resourcesステートメントと呼ばれます。その場合

翻訳の効果は、try文「内」リソース指定 を置くことです。 これは、拡張 のtry-と資源の文のcatch節が何らかのリソースの 自動初期化や決算への例外をキャッチすることができます。

はい、例外はあなたのcatchブロックによってキャッチされます。

1

はい、対象となります。

ヌルそうです、初期化部分でスロー例外がcatchブロックでキャッチされています

static InputStream getSomeStream() throws IOException { 
    throw new IOException(); 
} 

プリント

のIOExceptionと

try (InputStream in = getSomeStream()) { 
    System.out.println(in.read()); 
} catch (IOException e) { 
    System.err.println("IOException: " + e.getMessage()); 
} 

を実行します。

関連する問題