Java 中3目运算遇到的一个问题

今天 的写代码的过程中遇到了一个问题,问题可以抽象成下面的几行代码:

Integer b = null;
Integer a = true ? b : 3;

这个代码是想把b的null值传给a,但是不幸的是这个代码在第2行会抛出一个NullPointerException。
为什么会这样呢?原来是因为3目表达式的“:”两边的数据类型不一样,一个是Integer的一个是int的,所以这里的b默认做了个自动拆箱操作就是b.intValue(); 所以当然会抛NullPointerException了。
为了不抛异常下面的代码应该写成这样:

Integer b = null;
Integer a = true ? b : Integer.valueOf(3);

这样一来都是Integer相同类型的就不会去做拆箱操作了。
话说回来,其实在抽象代码的时候就可以看到错误提示了:
null不能拿来拆箱
从代码上就可以看到这个b上有个提示:Null pointer access: This expression of type Integer is null but requires auto-unboxing 这里把null拿来做拆箱操作了。但是在真实的业务中这个b就有可能不是单单一个null,他如果是个表达式编译器就看不出来了,所以还是需要多加留心。
另外,在用3目运算符的时候 一定要注意,尽量保证结果的2边数据类型保持一致

猜你喜欢

转载自blog.csdn.net/u012843361/article/details/83113066