3

使用方法test1()and 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

请参阅此问题的答案。基本上,编译器将尝试自动拆箱空值(并抛出空指针异常)。我认为这是您遇到问题的语法:

public int test3(int param) { 
    return (param > 0 ? param : null); 
} 
于 2010-06-07T02:49:09.133 回答
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"

理解条件运算符的所有复杂性?:可能非常困难。最好的建议是不要在第二个和第三个操作数中混合类型。

以下引用摘自Java Puzzlers, Puzzle 8: Dos Equis课程:

综上所述,条件表达式中的第二个和第三个操作数一般最好使用相同的类型。否则,您和您的程序的读者必须彻底了解这些表达式行为的复杂规范。

JLS 参考资料

于 2010-06-07T11:30:43.717 回答