3

次のコードがあります...

import java.util.Random;

public class ThreeArgumentOperator {

    private static final Random RANDOM = new Random();

    public static void main(String[] args) {
        String test;
        System.out.println(test = getValue() == null ? "" : test);
    }

    public static String getValue() {
        if (RANDOM.nextBoolean()) {
            return "";
        } else {
            return null;
        }
    }

}

Eclipseコンパイラー(私はJunoを使用しています)は次のエラーを報告します:

ローカル変数テストが初期化されていない可能性があります

私の質問は次のとおりです。この場合、コンパイラは変換できないことを報告するべきではありませんbooleanString==演算子が優先されることを理解している=ため、コンパイラはキャストについて文句を言う必要があります。代わりに、値が初期化されていない可能性について文句を言います。

次の行を変更すると

System.out.println(test = getValue() == null ? "" : test);

System.out.println((test = getValue()) == null ? "" : test);

すべてが正常に動作します。

javac編集:私はまた、直接使用してそれをコンパイルしようとしました。同じエラーが発生します。

error: variable test might not have been initialized
System.out.println(test = getValue() == null ? "" : test);
4

3 に答える 3

5

コンパイラーが提供するエラーは正しいです。演算子の優先順位に従って、==が最初に評価され、次に三項演算子が評価されます? :。つまり、ロジックの流れは次のとおりです。

getValue() == null

続行するために、この結果がであったと仮定しましょうfalse。次の式:

false ? "" : test

この結果は次のようになりますtest。そして私たちの最終的な表現...

test = test

しかしtest、初期化されなかったため、エラーが発生しました。

于 2012-12-15T18:03:04.743 に答える
2

問題がどこにあるのかよくわかりません。最初の式は

test = getValue() == null ? "" : test

つまり:testで初期化されます

  • getValue()nullを返す場合は空の文字列
  • testそれ以外の場合の値

テストはまだ初期化されていないtestため、それ自体で初期化することはできません。そのため、エラーメッセージが表示されます。

2番目の式は

(test = getValue()) == null ? "" : test

つまり:

  • testの結果で初期化getValue()
  • と比較testするnull
  • nullの場合test、式は空の文字列に評価されます
  • それ以外の場合は、の値に評価されますtest

なぜコンパイルすべきではないのですか?

于 2012-12-15T18:01:50.833 に答える
0

それは私には完全に理にかなっています。

2番目のコンパイルバージョンは、実際には2つの別個のステートメントです。これは次のコードと同等です。

test = getValue();
System.out.println(test == null ? "" : test);

最初に値を割り当てますtest

test = getValue();

test、値があります。2番目のステートメントは、nullでない場合の式の結果値を判別できtestます。

最初の非コンパイルバージョンは1つのステートメントであり、testまだ値がないため、割り当てる値test(つまりtest)は不明です。

于 2012-12-15T18:03:50.673 に答える