也许这个或类似的问题已经被写出来了,但我设法用Java17创建了NPE,我不太确定这是我的错误还是编译器的错误.
复制的代码非常简单:
Double v1 = null, v2 = null;
Double v3 = v1 != null ? v2 != null ? v1 + v2 : v1 : v2;
代码试图将最后一个值v2
拆箱,我不知道为什么需要这样做,而不是像我期望的那样直接存储它的值null
.
也许这个或类似的问题已经被写出来了,但我设法用Java17创建了NPE,我不太确定这是我的错误还是编译器的错误.
复制的代码非常简单:
Double v1 = null, v2 = null;
Double v3 = v1 != null ? v2 != null ? v1 + v2 : v1 : v2;
代码试图将最后一个值v2
拆箱,我不知道为什么需要这样做,而不是像我期望的那样直接存储它的值null
.
三元表达式的类型是每个分支的公共类型.单独的类型分别是v1 + v2
的double
和v1
和v2
的Double
.每当Java组合原语和它们的包装器时,它就会拆开包装器.它不判断目标类型.
解决方法很容易—强制v1 + v2
变成Double
:
Double v3 = v1 != null ? v2 != null ? Double.valueOf(v1 + v2) : v1 : v2;