Java コンパイラは について何も知りませんSystem.exit
。それに関する限り、これは単なるメソッドであるため、ステートメントの最後に到達できます。
あなたはそれを言い、 「目に見えて到達できない」と言っていますが、それはあなたが何をするかを知っているからです。言語はそうではありませんが、ステートメントが何をするかは知っていますが、実際には到達できないことを知っています。L1
L2
System.exit
return
L3
メソッドvoid
が単に. コンパイラはその情報を使用して、呼び出し式の最後に到達できないようにし、この種の問題を防ぐことができます。ただし、これは言語設計に関する私の夢です。Javaには類似したものはありません。その概念を表現できない場合に、特定の JRE メソッドが正常に返らないことをコンパイラが「認識する」ことは非常に悪い考えです。言語内で直接。
代わりに、コンパイラは、次のような JLS のセクション 14.21 の規則に拘束されます。
- switch ブロックではない空でないブロックの最初のステートメントは、ブロックが到達可能である場合に到達可能です。
- switch ブロックではない空でないブロック内の他のすべてのステートメント S は、S の前のステートメントが正常に完了できる場合に到達可能です。
...
式ステートメントは、到達可能であれば正常に完了できます。
(メソッド呼び出しは式ステートメントです。)
次に、セクション 8.4.7 から:
メソッドが戻り値の型を持つように宣言されている場合、メソッドの本体が正常に完了すると、コンパイル時エラーが発生します (§14.1)。
そして14.1では:
特に指定がない限り、ステートメントが評価するすべての式と実行するすべてのサブステートメントが正常に完了する場合、ステートメントは正常に完了します。
System.exit()
したがって、コンパイラに関する限り、への呼び出しは正常foo
に完了できます。つまり、メソッドの本体が正常に完了し、エラーが発生します。