14

私は最近、リリース前にコード ベースからコード ブロックを削除し、実行を防ぐために if(false) ステートメントを使用していました。

if (false) {
    ArrayList<String> list = new ArrayList<String>();
    ...
}

これは正常にコンパイルされ、問題のあるコードブロックの実行を防ぎます (正しいか間違っているか、それは現在の引数ではありません)。

ただし、偶然にも、上記のブロックを次のように変更しました。

while (false) {
    ArrayList<String> list = new ArrayList<String>();
    ...
}

到達不能ステートメントのコンパイル エラーを受け取りました。

私はコンパイルエラーに感謝し、その理由を理解していますが、2つのブロックの違いと、前者は正常にコンパイルされるのに、両方に到達できないステートメントがある場合に後者がうまくコンパイルされない理由を理解するのに苦労しています。

4

2 に答える 2

13

どちらの場合も、中括弧の間のコードは本質的に無意味ですが if (false)、 C/C++ プリプロセッサをシミュレートするために Java に保持されているため、コンパイラはエラーを発生させる必要があります。これは#if 0、テストまたはデバッグのためにコードの一部を無効にする非常に一般的な方法です。

編集: 参考までに、「条件付きコンパイル」については、Java 言語仕様の 14.21 章の最後に詳しく説明されています。

于 2013-05-08T14:19:07.517 に答える
1

「Java は単純なフロー分析アルゴリズムを使用して、到達不能コードの最も一般的なケースを検出し、そのような到達不能コード ブロックはすべてコンパイル時エラーとしてフラグが立てられます。そのため、"while (false) { ... }" ステートメントでエラーが発生します。 .

ただし、Java は「if (false) { ... }」に対して特別な例外を設けています。これは、プログラマーが開発中にこの構造を使用して、プログラムの一部を一時的に無効にすることがよくあるためです。そのため、コンパイラはこのステートメントを受け入れます。

詳細に興味がある場合は、Java 言語仕様の到達不能ステートメントの説明 @ http://docs.oracle.com/javase/specs/#14.21を参照してください。"

http://www.coderanch.com/t/266678/java-programmer-SCJP/certification/false-falseから引用

于 2013-05-08T14:43:13.680 に答える