使用方法test1()
和test2()
,我得到类型不匹配错误:无法从null转换为int ,这是正确的;但为什么我在方法test3()
中没有得到相同的内容?在这种情况下,Java如何以不同方式评估条件表达式? (显然,NullPointerException
会在运行时上升)。这是一个遗漏的错误吗?
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);
}
}
提前致谢!
答案 0 :(得分:2)
查看this问题的答案。基本上,编译器将尝试自动取消装入空值(并抛出空指针异常)。我认为这是您遇到问题的语法:
public int test3(int param) {
return (param > 0 ? param : null);
}
答案 1 :(得分: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 的教训:
总之,通常最好在条件表达式中对第二个和第三个操作数使用相同的类型。否则,您和您的程序的读者必须彻底了解这些表达式行为的复杂规范。