三元操作符
语法:
代码语言:javascript复制variable = Expression1 ? Expression2: Expression3
含义:
代码语言:javascript复制if(Expression1)
{
variable = Expression2;
}
else
{
variable = Expression3;
}
你会碰到奇怪的NullPointerException吗
示例:
代码语言:javascript复制public static void main(String[] args) {
int a = 2;
Integer b = null;
System.out.println( a > 3 ? a: b);
}
结果:
由于java14版本对NPE异常增加了新特性,可以详情展示NPE发生的具体信息,我们可以很容易看到哪个变量发生了NPE异常。但是早期的版本是不具有这样的功能。
大多数看到NPE异常,可能会感觉莫名其妙,不是返回null吗即b值?
三元操作符有很多规则,其中一条就是原生类型与包装类型同时出现,包装类型可能会自动转换为原生类型,这个时候由于包装类型为null,而发送NPE异常。
This conversion may include boxing or unboxing conversion (§5.1.7, §5.1.8). https://docs.oracle.com/javase/specs/jls/se17/html/jls-15.html#jls-15.25
其它规则:比如原生类型的类型不同,会发生类型自动转换,基本都是范围小的类型转换为范围大的类型。
小结
三元操作符帮我们省去了if-else的判断,但同时引入了类型转换规则及自动装箱与拆箱规则,自动拆箱规则很容易导致NPE异常。