![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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点を教えていただきたいです。
よろしくお願いします。
No.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のクローズ
}
とした方がいいです。
回答ありがとうございました。
実行環境がある所で実践してみました。
理屈では、おそらくそうなるのだろうなぁというのは、
感じてたんですが、実践してみて納得です。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Javaのソースコード作成が難しいです... 10 2022/11/11 14:06
- Java すみません。助けてください。 javaについての質問です。 integerに変換できない数値をエラー 5 2022/05/18 19:16
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- その他(プログラミング・Web制作) zshの例外処理 1 2022/06/02 16:36
- Wi-Fi・無線LAN 「無線LAN親機(4ストリーム)」「無線LAN中継機(2ストリーム)」の組み合わせは大丈夫ですか? 3 2023/07/28 19:10
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- ルーター・ネットワーク機器 無線LAN親機の電波強度について 8 2023/08/18 18:57
- 英語 分離不定詞 1 2023/07/16 17:29
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VB.Net Object型 空かどうか
-
C#で例外が発生したとき、例外...
-
全角スペースのチェックについて
-
VBA Evaluate関数 型が一致しま...
-
文字列が数字のみで構成されて...
-
struts2 例外時にエラー画面に...
-
C#の捕捉されない例外処理の対...
-
String型の日付(2005/11/25)の...
-
0除算の例外処理ができない!!...
-
連続する「\\」をひとつの「\\...
-
文字列からダブルクオートの削除
-
文字列比較に 比較演算子(==...
-
例外ってIf文の中に入れますか...
-
[C#][FX]DLLを利用した共有メモ...
-
数字か文字列かを判定する関数
-
Excelでのエラー
-
try catchについて
-
C# マルチスレッドにおける例外...
-
ファイルダイアログを開いた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
【JAVA】与えられた金額を貨幣...
-
時間の取得
-
VB.Net Object型 空かどうか
-
連続する「\\」をひとつの「\\...
-
数字か文字列かを判定する関数
-
String型の日付(2005/11/25)の...
-
VBA Evaluate関数 型が一致しま...
-
0除算の例外処理ができない!!...
-
VB.NETで16進数が正しいかどう...
-
文字列が数字のみで構成されて...
-
Timestamp型への変換について(J...
-
例外ってIf文の中に入れますか...
-
全角スペースのチェックについて
-
ファイルダイアログを開いた時...
-
C# マルチスレッドにおける例外...
-
VBA 400エラー 1004エラー
-
nullで、return出来るのはどん...
-
C#の捕捉されない例外処理の対...
-
C# UriFormatExceptionの回避
おすすめ情報