- ベストアンサー
try catchについて
- try catchについての質問です。内側でスローされた例外は、外側でcatchされるのでしょうか?
- また、内側でcatchをしなかった場合、外側でcatchされるのでしょうか?
- 質問者はtry catchの動作について知りたいとのことです。
- みんなの回答 (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のクローズ } とした方がいいです。
お礼
回答ありがとうございました。 実行環境がある所で実践してみました。 理屈では、おそらくそうなるのだろうなぁというのは、 感じてたんですが、実践してみて納得です。 ありがとうございました。