18
        final int a = 1;
        final int b;
        b = 2;
        final int x = 0;

        switch (x) {
            case a:break;     // ok
            case b:break;     // compiler error: Constant expression required

        }
        /* COMPILER RESULT:
                constant expression required
                case b:break;
                     ^
                1 error
        */

この種のエラーが発生するのはなぜですか? 私がやっていたらfinal int b = 2、すべてがうまくいきます。

4

3 に答える 3

15

switch ステートメントのケースは、コンパイル時に定数にする必要があります。コマンド

final int b=2

コンパイル時に2toの値を割り当てます。bただし、次のコマンドはat Runtime2の値をtoに割り当てます。b

final int b;
b = 2;

switchしたがって、ステートメントのいずれかのケースで定数が見つからない場合、コンパイラは文句を言います。

于 2013-04-27T18:24:10.573 に答える
11

b初期化されていない可能性があり、複数の値が割り当てられる可能性があります。あなたの例では明らかに初期化されていますが、おそらくコンパイラはそれを認識していません(そしてできません)。想像:

final int b;
if (something) {
   b = 1;
} else {
   b = 2;
}

コンパイラは に定数を必要としますswitchが、 の値はb何らかの外部変数に依存します。

于 2013-04-27T18:08:04.200 に答える
3

値が割り当てられていない最後の変数は、空の変数と呼ばれます。空白のファイナルは 1 回だけ割り当てることができ、割り当てが発生したとき、またはプログラム内で 1 回、割り当てを解除する必要があります。

これを行うために、Java コンパイラはフロー分析を実行して、空白の最終変数への代入ごとに、その変数が代入前に確実に未代入であることを確認します。そうしないと、コンパイル時エラーが発生します

これが、コンパイラが switch コンストラクトをコンパイルするときに、必要な定数式をスローする理由です。これは、b の値がコンパイラに認識されないためです。

于 2013-04-27T18:20:27.197 に答える