0

次のコード ブロックでは、コンパイル時エラーが発生します。

        while(false)
        {
          System.out.println("HI");
        }

エラーは、到達不能なステートメントがあることを示しています。しかし、次のコードはコンパイルされます

   boolean b=false;
   while(b)
   {
        System.out.println("Hi");
    }

私が考えることができたのはこれだけでした-> case-1 as false はリテラルであるため、コンパイラは到達不能であり、case 2 変数 b の while 条件ブロックは実行時にチェックされるため、コンパイルエラーはありませんか?

4

5 に答える 5

3

コンパイラの作成者は、エラーとしてフラグを立てる条件を決定することはできません。ルールは Java 言語仕様にあり、この問題については14.21 Unreachable Statementsにあります。

関連する文は次のとおりです。

いずれの場合も、到達可能な while ステートメントがあります。最初のバージョンでfalseは、 は値が false の定数式であるため、含まれているステートメントは到達可能とは見なされません。2 番目のバージョンでは、bは定数式ではないため、含まれているステートメントは到達可能として扱われます。

finalの宣言に追加するとb、while 条件が値が false である定数式に変更され、含まれているステートメントに再び到達できなくなります。

JLS でコンパイル時エラーとなるものとそうでないもののルールを指定することには、すべての Java コンパイラが同じプログラム セットを受け入れる必要があるという利点があります。ルールは一般に、おそらくコンパイラを書くコストと困難を制限するために、コンパイラがデータフロー分析を行うことを要求しません。

于 2013-09-11T23:56:29.477 に答える
2

コンパイラはを認識while(false)しますが、これは決して true にならないため、println. これはエラーをスローします。

一方、while(b)true になることはありませんが、コンパイラはこれを自動的に認識しません。これは、bが自動的に false にならないためです。これはbooleanたまたま値 を持っているためfalse、ある時点で変更される可能性があります。(ここにはありませんが、ある可能性があります)。

この点をより一般的にするために、コンパイラは変数の型を調べますが、変数が実際に何であるかは調べません。多くの初級プログラミング クラスには、ポリモーフィズムと型キャストが実行時エラーやコンパイラ エラーにつながるケースについて説明するセクションがあります。たまたまこのようなコースを受講したことがある場合は、ここでの質問も同様の説明があると考えることができます。

于 2013-09-11T23:34:20.720 に答える
2

これは私には理にかなっています。while (false) は正常に評価されることはありませんが、while(b) の場合、プログラムの存続期間のある時点で b の値が true に更新される可能性があります。

于 2013-09-11T23:35:35.250 に答える
1

コンパイラは物事について非常に賢いわけではありません。間違いであることが証明されているブロックを見つけて、泣きます。このようなものを与えると、そこjavacまで見えるように配線されていません。人間にとって明白なことがコンピュータにとって必ずしも明白であるとは限らず、その逆も同様です。

于 2013-09-11T23:32:28.300 に答える