1

制御が到達しないことが保証されているコード行をJavaが見つけた場合、コンパイラは到達不能コードエラーを報告します。
次のコードを検討してください。

    static int method1() {

        try{ return 1; }
        catch(Exception e){ }  // LINE-1
        finally{ }
        System.out.println("abc");  //LINE-2
        return 2;
    }
}

上記のコード
1では、 try ブロックは 1 を返すことによって終了することが保証されていますが、finally ブロックの後の行 (LINE-2 以降) には到達可能です。
2 . catch ブロック (LINE-1) をコメントすると、LINE-2 に到達できなくなります。

なぜそうなのか。コンパイラは、ケース 1 の try ブロックで無条件のリターンを確認できません。

4

4 に答える 4

7

これは、 JLS 14.21の関連部分です。

次のtry両方が真である場合、ステートメントは正常に完了できます。

  • tryブロックが正常に完了したり、任意のcatchブロックが正常に完了したりできます。

  • tryステートメントにfinallyブロックがある場合、finallyブロックは正常に完了できます。

この場合、try ブロックは正常に完了できませんが、正常に完了できるcatch ブロックがあります。finally ブロックも正常に完了できます。

tryステートメントは到達可能であり、正常に完了することができるため、その後のステートメントは到達可能です。

ブロックを削除するcatchと、上記の引用セクションの最初の箇条書きは当てはまりません。つまり、tryステートメントが正常に完了できず、その後のステートメントに到達できなくなります。

于 2016-08-18T16:48:19.000 に答える
3

tryブロック (まあ、付き) はcatch「ここにあるものは例外になる可能性がある」ことをコンパイラーに伝えます。そのため、コンパイラは、returnステートメントが含まれていても、tryブロック正常に返されない可能性があると想定します。

その仮定を考えると、catchおよび に到達する論理パスがありfinallyます。そして、それらのどちらも返されないため、その同じ論理パスは全体をtry/catch/finally完全に結論付け、その後のコードに到達することになります。

基本的に、コンパイラ (その設計者) は、複雑なルールよりも単純なルールを好みます。単純なルールは、テストとサポートが容易で、将来のバージョンとの下位互換性があります。したがって、ロジックをより徹底的に分析している人間にとっては、そのコードに到達することは不可能ですが、コンパイラにとっては完全に可能です。

于 2016-08-18T16:45:52.093 に答える
1

try ブロック内の return ステートメントについて考える必要はありませんが、try ブロック自体について考える必要があります。try ブロックを認識し、そこに catch が必要です (オプションで、finally ブロックを含めることができます)。catch ステートメントを削除すると、try ブロックはエラーが発生した場合に何をすべきかわからないため、それ以下には到達しません (したがって、到達不能コード エラー)。

コンパイラは、「try ブロックがエラーを出力した場合、このコードはどうなりますか? そのエラーから回復する方法を知らされていないため、その下のコードは実行されません」と考えます。

catchステートメントがあると、コンパイルはちょっと考えます-「CODE HERE」を試して、それがうまくいかない場合は、エラーをキャッチして「CODE HERE」を実行し、オプションで最終的に「CODE HERE」を実行します。次に、通常どおりブロックの下で実行します。

于 2016-08-18T16:56:40.163 に答える
1

コンパイラは、catchブロックがあることを確認Exceptionし、それが発生する可能性があると想定しています (可能性があると伝えたため)。finallyは の後に到達可能であるため、catchそれに続くコードも同様です (catchブロックは関数を終了するために何もせず、どちらも を終了しませんfinally)。2 番目に をコメントアウトするcatchと、コンパイラは、最終的にどのような条件でも最後に到達しないことを認識し、エラーが発生します。

于 2016-08-18T16:45:11.207 に答える