Java避坑指南之:三元操作符(?: )

2023-06-19 16:06:53 浏览数 (1)


三元操作符


语法:

代码语言: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异常。


0 人点赞