java - 为什么三元运算符在自动拆箱的情况下会抛出 NPE?
问题描述
在以下测试中,getDummyAge()
不应评估该方法,因为testage
变量始终为null
。
public class IntegerTest {
@Test
public void intergerTestFailure() {
Integer testage = null;
Integer age = (testage != null) ? getDummyAge() : testage;
}
private int getDummyAge() {
return 0;
}
}
虽然这会引发异常:
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 的 my.IntegerTest.intergerTestFailure(IntegerTest.java:18) 的 java.lang.NullPointerException java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566)
这是一个jdk错误吗?
解决方案
Integer age = (testage != null) ? getDummyAge() : testage;
相当于
Integer age = Integer.valueOf((testage != null) ? getDummyAge().intValue() : testage);
因为不同类型的数字第二和第三个操作数经历二进制数字提升;条件运算符的结果是int
,然后必须将其装回以Integer
进行赋值。
这是指定的。
如果你想避免 NPE,请int
明确框:
Integer age = (testage != null) ? Integer.valueOf(getDummyAge()) : testage;
相同类型的盒装数字操作数不会被拆箱。
推荐阅读
- node.js - 即使在时间结束后如何停止节点计划重复作业
- json - Flutter:参数类型“String”不能分配给参数类型“Uri”
- assembly - x64 中的这段代码有什么问题?它在 VS2019 中不返回 0
- rust - 将 ty 转换为 macro_rules 中的 ident
- python - 不显示提取的数据
- spring - 如何在 Spring-boot 应用程序中获取 context-path 和 info.info?
- python - 是否可以通过迭代附加到数据框?
- scala - 在 Scala 中导入 Doodle 库
- javascript - 带有 json 转义的 Mustache 渲染
- amazon-web-services - 如何为基于事件的数据构建 DynamoDB 表?