在以下测试中,不应评估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.lang.NullPointerException在 my.IntegerTest.intergerTestFailure(IntegerTest.java:18)在 java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机 方法) 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的错误吗?
答案 0 :(得分:1)
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;
没有装箱的相同类型的数字操作数。