3

メソッドtest1()test2()を使用すると、Type Mismatch Error: Cannot convert from null to intが発生します。これは正しいです。しかし、なぜメソッドで同じ結果が得られないのtest3()ですか? その場合、Javaは条件式をどのように異なる方法で評価しますか? (明らかに、 aNullPointerExceptionは実行時に上昇します)。欠落エラーですか?

public class Test {

    public int test1(int param) {
        return null;
    }

    public int test2(int param) {
        if (param > 0)
            return param;
        return null;
    }

    public int test3(int param) {
        return (param > 0 ? param : null);
    }

}

前もって感謝します!

4

2 に答える 2

2

条件演算子は、演算子の型を混在させると非常に扱いにくくなります。それは多くのJava Puzzlersの主題です。

典型的な例を次に示します。

System.out.println(true ? Integer.valueOf(1) : Double.valueOf(2));
// prints "1.0"!!!

そして、ここに別のものがあります:

System.out.println(true ? '*' : 0);     // prints "*"
int zero = 0;
System.out.println(true ? '*' : zero);  // prints "42"

そして、あなたが発見したように:

System.out.println(true  ? 1 : null);   // prints "1"
System.out.println(false ? 1 : null);   // prints "null"

条件演算子のすべての複雑さを理解するのは?:非常に難しい場合があります。最善のアドバイスは、2 番目と 3 番目のオペランドで型を混在させないことです。

次の引用は、 Java Puzzlers のレッスン、Puzzle 8: Dos Equisからの抜粋です。

要約すると、一般に、条件式の 2 番目と 3 番目のオペランドには同じ型を使用するのが最善です。それ以外の場合、ユーザーとプログラムの読者は、これらの式の動作に関する複雑な仕様を完全に理解している必要があります。

JLS リファレンス

于 2010-06-07T11:30:43.717 に答える
2

この質問への回答を参照してください。基本的に、コンパイラは null 値を自動アンボックスしようとします (そして null ポインター例外をスローします)。これはあなたが問題を抱えていた構文だと思います:

public int test3(int param) { 
    return (param > 0 ? param : null); 
} 
于 2010-06-07T02:49:09.133 に答える