質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

4154閲覧

【Java・例外処理】catchブロックから新たに例外をthrowすることの可否について

moritat-222

総合スコア19

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2020/10/04 09:03

現在、Java Silverの勉強をしています。

例外処理について、catchブロックから新たに例外をthrowすることの可否について質問致します。

以下のコードでは、Exceptionをcatchした後で、catchブロックの中で新たにRuntimeExceptionをthrowしています。
しかし、RuntimeExceptionが次のcatchブロックでcatchされることはなく、RuntimeExceptionをキャッチするブロックが到達不能コードとなるのでコンパイルエラーになります。

java

1public class Main { 2 public static void main(String[] args) { 3 try{ 4 throw new Exception(); 5 } catch (Exception e){ 6 throw new RuntimeException(); 7 }catch (RuntimeException e){ 8 System.out.println("A"); 9 }finally{ 10 System.out.println("B"); 11 } 12 } 13} 14

ここで、Exceptionをcatchするブロックが、RuntimeExeptionをcatchするブロックよりも前にきていることがエラーの原因になるならば、

RuntimeExeptionをcatchするブロックを先に記述し、そこからExceptionをthrowしたらどうなるのかと考えて記述してみました。

java

1public class Main { 2 public static void main(String[] args) { 3 try{ 4 throw new RuntimeException(); 5 } catch (RuntimeException e){ 6 throw new Exception(); 7 }catch (Exception e){ 8 System.out.println("A"); 9 }finally{ 10 System.out.println("B"); 11 } 12 } 13}

この場合、「例外java.lang.Exceptionは報告されません。スローするには、捕捉または宣言する必要があります」というエラーメッセージが出てしまいます。

Exceptionは、RuntimeExceptionをcatchするブロックの次のブロックでcatchするよう記述しているのですが、なぜこのようなエラーメッセージが出てしまうのでしょうか。

そもそも、catchブロックで新たな例外をthrowし、その例外を次のcatchブロックでcatchさせる、という処理が不可能なものなのでしょうか。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この構文は、tryブロック内で発生した例外を、それに対応するcatchブロックで捕捉する、という仕組みになっています。

java

1public class Main { 2 public static void main(String[] args) { 3 try{ //Block A 4 throw new RuntimeException(); 5 } catch (RuntimeException e){ //Block B 6 throw new Exception(); 7 }catch (Exception e){ //Block C 8 System.out.println("A"); 9 }finally{ //Block D 10 System.out.println("B"); 11 } 12 } 13}

Block Cでキャッチできる例外はBlock Aで発生したものだけです。
Block Bはそもそもtryブロックに属しておらず、catchの相手がいません。

投稿2020/10/04 10:41

編集2020/10/04 11:08
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moritat-222

2020/10/04 10:45

回答ありがとうございます。 catchブロックでキャッチできるのは、tryブロックで発生した例外だけなのですね。 それ故に、catchブロックの中で例外をthrowすると、どこからもキャッチされることなく例外発生となる、と納得できました。大変ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問