1. ホーム
  2. java

[解決済み] なぜJavaは "unreachable statement "というコンパイラーエラーが発生するのですか?

2023-05-27 11:21:20

質問

プログラムをデバッグするとき、コードのブロックの中にreturn文を挿入すると便利なことがよくあります(間違いなく悪い習慣ですが)。私は Java でこのようなものを試してみるかもしれません ....

class Test {
        public static void main(String args[]) {
                System.out.println("hello world");
                return;
                System.out.println("i think this line might cause a problem");
        }
}

もちろん、これではコンパイラーエラーが発生します。

Test.java:7: 到達不能なステートメント

未使用のコードを持つことは悪い習慣なので、警告が正当化されるかもしれない理由は理解できます。しかし、なぜこれがエラーを発生させる必要があるのか理解できません。

これは単にJavaがナニーであろうとしているだけなのか、それともこれをコンパイラーエラーにする正当な理由があるのでしょうか?

どのように解決するのですか?

到達不可能なコードはコンパイラにとって無意味だからです。コードを人々にとって意味のあるものにすることは、コンパイラーにとって意味のあるものにすることよりも重要かつ難しいことですが、コンパイラーはコードの本質的な消費者なのです。Java の設計者は、コンパイラにとって意味のないコードは誤りであるという見解をとっています。彼らのスタンスは、到達不可能なコードがある場合、それは修正される必要がある間違いを犯したということです。

ここにも似たような質問があります。 到達不能なコード: エラーか警告か? プログラマがコードの一部を書く場合、それは常に何らかのシナリオで実際に実行することを意図したものであるべきだ」と著者は述べています。

到達不可能なコードがコンパイルを妨げるべきかどうかは、決してコンセンサスが得られない問題です。しかし、これは Java の設計者がそれを行った理由です。


コメントで多くの人が、Javaがコンパイルを妨げない到達不可能なコードの多くのクラスがあることを指摘しています。もし私がゲーデルの結果を正しく理解しているならば、どんなコンパイラーも到達不可能なコードのすべてのクラスを捕らえることはできないはずです。

ユニットテストはすべてのバグをキャッチすることはできません。私たちは、その価値に対する議論としてこれを使用しません。同様に、コンパイラーはすべての問題のあるコードをキャッチすることはできませんが、それができるときに悪いコードのコンパイルを防止するために、それはまだ価値があります。

Java言語設計者は、到達不可能なコードをエラーと見なします。そのため、可能な限りそれをコンパイルしないようにすることは合理的です。


(downvoteする前に: 問題はJavaがunreachable statementコンパイラーエラーを持つべきかどうかではありません。問題は なぜ Javaはunreachable文のコンパイラエラーを持っています。Java が間違った設計上の決定をしたと思うからと言って、私にダウンヴォートをしないでください)。