也许这个或类似的问题已经被写出来了,但我设法用Java17创建了NPE,我不太确定这是我的错误还是编译器的错误.

复制的代码非常简单:

Double v1 = null, v2 = null;
Double v3 = v1 != null ? v2 != null ? v1 + v2 : v1 : v2;

代码试图将最后一个值v2拆箱,我不知道为什么需要这样做,而不是像我期望的那样直接存储它的值null.

推荐答案

三元表达式的类型是每个分支的公共类型.单独的类型分别是v1 + v2doublev1v2Double.每当Java组合原语和它们的包装器时,它就会拆开包装器.它不判断目标类型.

解决方法很容易—强制v1 + v2变成Double:

Double v3 = v1 != null ? v2 != null ? Double.valueOf(v1 + v2) : v1 : v2;

Java相关问答推荐

Gmail Javi API批量处理太多请求

JsonPath在多个线程中返回错误的值

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

是否在允许数组元素为空时阻止 idea 为空性警告?

无法使用ApacheSpark依赖项构建JavaFX应用程序

如何使用带有谓词参数的方法,而不使用lambda表达式

在VS代码中,如何启用Java Main函数的&Q;Run|DEBUG&Q;代码?

Java SSLKeyManager出厂密码

在macOS上读取文件会导致FileNotFound,即使文件存在(并且具有权限)

基于配置switch 的@Controller的条件摄取

从泛型枚举创建EnumMap

在Oracle db中,当我们提供字符串而不是数字时,比较是如何工作的?

OAuth:登录后无法查看Google邮箱地址

在Spring Boot中使用咖啡因进行缓存-根据输出控制缓存

如何通过用户ID向用户发送私信

为什么Instant没有从UTC转换为PostgreSQL的时区?

PhantomReference无法访问时会发生什么?

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

如何从指定某些字段的父对象创建子对象

如何在Java上为循环数组从synchronized迁移到ReentrantLock