2

重複の可能性:
このコードで「Unreachable Statement」エラーが発生するのはなぜですか?

これはとても簡単な質問のように思えます。私はこの質問を 1 つの本で見つけました。エラーが発生する理由を誰かが理解するのを手伝ってくれたら。

    do {
        System.out.print("inside do");
    } while (false);
    while (false) { // error
        System.out.print("inside while");
    }
    System.out.print("outside");

私は考えました、そして私によれば、出力はdooutside の中にあるべきです。しかし、それはCompiler Error : Unreachable Statementを示しています。次に、なぜ、Compilation error : Unreachable Statement*が表示されているのかを調べようとしました。したがって、上記のコードを次のように変更します

  boolean i = false;  
  do {
        System.out.print("inside do");
    } while (false);
    while (i) { // ok
        System.out.print("inside while");
    }
    System.out.print("outside");

現在、期待される出力、つまりdooutside の内部が表示されています。だから、私の質問は - 最初のケースと 2 番目のケースの違いは何ですか? また、調べてみると

if(false){ 
  //something here
   }

その後、上記のコードはエラーなしで実行されます。

4

2 に答える 2

6

最初の2つの例の主な違いは、最初のケースでは条件が定数であるのに対し、2番目のケースではそうではないことです。

たとえば、に変更boolean i = false;するfinal boolean i = false;と、iが定数になっているため、同じコンパイルエラーが発生します。

到達不能ステートメントのルールは、JLS14.21で定義されています。特に、定数である可能性のある構造ifを許可するための特別な処理があります。if(DEBUG)DEBUG

do / whileは内部のステートメントが1回実行されるので問題ありません。

この関連記事の定数に関する詳細。

于 2012-12-22T07:40:25.953 に答える
5

コードに到達できないため、コンパイラは到達不能ステートメントエラーを出します。System.out.print("inside while");

while (false) { // error
    System.out.print("inside while");
}

コンパイラはそれが決してwhile (false)真になることはないことを知っており、デッドコードについて(エラーで)警告します。

while対照的に、代わりに変数を入れると、変数の性質は変数が変化(変化)する可能性があるため、コンパイラーの静的分析は到達不能コードを識別しません。(あなたや私がそれを見て「そのコードは決して実行されない」と言うことができる多くの状況でさえ、コンパイラの分析はかなり浅いです、それはそれが主な仕事ではありません。あなたができるより強力な分析とコードカバレッジツールがあります使用する。)

に関してif (false)、これはJLSがそれについて言わなければならないことです:

例として、次のステートメントはコンパイル時エラーになります。

while (false) { x=3; }

ステートメントx=3; 到達できません。しかし、表面的には似たようなケースです。

if (false) { x=3; }

コンパイル時エラーは発生しません。最適化コンパイラは、ステートメントx=3;が実行されないことを認識し、生成されたクラスファイルからそのステートメントのコードを省略することを選択できますが、ステートメントx=3;は、ここで指定された技術的な意味で「到達不能」とは見なされません。

この異なる扱いの理論的根拠は、プログラマーが次のような「フラグ変数」を定義できるようにすることです。

static final boolean DEBUG = false;

次に、次のようなコードを記述します。

if (DEBUG) { x=3; }

アイデアは、の値をDEBUGfalseからtrueまたはtrueからfalseに変更してから、プログラムテキストに他の変更を加えることなくコードを正しくコンパイルできるようにすることです。

于 2012-12-22T07:29:30.843 に答える