dポイントプレゼントキャンペーン実施中!

try catchの動きで質問があります。
以下が簡略化したソースです。
-------ここから---------------------
ストリーム1;
ストリーム2;
try{
try{
//ストリーム1を使った処理
}catch(IOException e){
throw e;
}finally{
//ストリーム1のクローズ
}
try{
//ストリーム2を使った処理
}finally{
//ストリーム2のクローズ
}
} catch(IOException e){
throw new hogeException();
}
------ここまで--------------------------

内側でスローされた例外は、外側でcatchされるのですか?
また、内側でcatchをしなかった場合、外側でcatchされるのですか?
この2点を教えていただきたいです。
よろしくお願いします。

A 回答 (1件)

try ... catch文はそのブロック内で発生した例外をcatchします。


質問にある例で言えば、ストリーム1を使った処理で例外が発生すれば内側のtry ... catch文でcatchされます。
ただし内側のcatch文で "throw e;" としているのでこの例外を処理するハンドラを探しに行く(あまりいい表現ではありませんが…)ことになります。
その例外ハンドラが外側のtry ... catch文になります。

> 内側でスローされた例外は、外側でcatchされるのですか?
> また、内側でcatchをしなかった場合、外側でcatchされるのですか?

内側でthrowされた例外は内側でcatchします。
ただし内側のcatch文でそのまま例外を投げているので、それを外側でcatchします。

理屈より実践。
下記のソースコードを動かしてみれば分かりますよ。

----------
try {
try {
reader = new FileReader(new File("")); // FileNotFoundExceptionが発生
} catch (Exception e) {
System.out.println("内側のtry-catch: " + e.getMessage());
throw e;
} finally {
System.out.println("内側のtry-catch: Finally 1");
}
} catch (Exception e) {
System.out.println("外側のtry-catch: " + e.getMessage());
} finally {
System.out.println("外側のtry-catch: Finally 2");
}
----------

ただし個人的な意見ですが、処理上必要な場合以外はtry ... catch文のネストはオススメしません。
質問にある例も

try {
//ストリーム1を使った処理
//ストリーム2を使った処理
} catch (IOException e) {
throw new hogeException();
} finally {
//ストリーム1のクローズ
//ストリーム2のクローズ
}

とした方がいいです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

実行環境がある所で実践してみました。
理屈では、おそらくそうなるのだろうなぁというのは、
感じてたんですが、実践してみて納得です。
ありがとうございました。

お礼日時:2009/06/20 13:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!