LoginSignup
question2022
@question2022 (step1engineer)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

java silver学習 例外処理(到達不可能なコード)について

解決したいこと

現在java silver取得に向けて、紫本と黒本を使用し勉強しています。
黒本第8章No.3の以下問題で、回答の文章が理解できずにつまづいています。

テキスト記載の問題の画像を1枚、
テキスト記載の解説を画像を2枚(今回に関係のない箇所はバツを書いています)
添付しました。

解説2枚面の赤い星を書き込んでいる箇所の文章が理解できない部分です。
同じ8章のNo.1,2は問題を解き、解説を読んで理解できたつもりでいます。

ネットで「到達不可能なコード」について調べたところ、とあるサイトで
「到達不可能なコードとは、catch節に対するtry説のなかで、
 catch節に書かれた例外が発生しないことを意味する」
とありました。
この言い回しだとなるほど、となるのですが、
いざ上記の問題No.3を解こうとすると、解説文が理解できず進めなくなってしまいました。

解説2枚目の画像のなかの、赤い星をマークしている文章について
かみ砕いて文章の意味を教えていただける方、いませんでしょうか。
既に簡単な表現なのかもしれませんが、自分には理解できず、お力を貸していただきたいです。

質問文のなかで説明が足りない箇所等ありましたら、ご指摘をいただけますと助かります。
よろしくお願いいたします。
問題.jpg
解説1.jpg
解説2.jpg

1

2Answer

まず、前提としてこれがコンパイルエラーになるのは「到達不可能なcatch句ができる」ためです。
それを前提に話を進めます。

SubSampleExceptionがスローされた時、一つ目のcatchブロックは、このインスタンスへの参照をスーパークラスであるSampleException型で受け取ることが可能。

これは簡単に言うと「SubSampleExceptionは、一つ目のcatch句で処理されちゃうから、二つ目っていけないよね」って言っています。
何故行けないかというと、SubSampleExceptionは、一つ目のSampleExceptionの継承関係にあるためです。

1

Comments

  1. @question2022

    Questioner

    はじめまして。ご回答ありがとうございます。
    1つ目のcatch区で処理されてしまう、
    というご説明の文章ですっと理解できた気がしています。
    継承関係であることもポイントとして教えていただきありがとうございます。

「到達不可能なコード」とは、絶対に実行されないことが分かっているコードのことです。
「実行時に if 文の条件式の変数がたまたま false で、その中のブロックが実行されない」とかではなく、コンパイル時に確定しているものです。
そのうち何種類かはコンパイルエラーになります。

到達不可能なコードで最も分かりやすいのはおそらくこれでしょう
return で method1 の処理が終了するので、println は絶対に実行されません。

    static void method1() {
        return;
        System.out.println("ここは到達不可能");
    }

これはコンパイルエラーになります。

1

Comments

  1. @question2022

    Questioner

    はじめまして。ご回答ありがとうございます。
    サンプルコードを提供いただきまして助かります。
    ノートにメモをして振り返れるようにしました。
    ありがとうございます。

Your answer might help someone💌