gpt4 book ai didi

java - NullPointerException 是从哪里来的?

转载 作者:行者123 更新时间:2023-11-30 08:25:24 29 4
gpt4 key购买 nike

我正在尝试编写将两位数字转换为 2000 + 数字的方法,按原样返回所有其他数字,并在将 null 作为参数传递时返回 null。

此实现按预期工作

private Integer convertTo4Digits(Integer modelYear) {
boolean isTwoDigit = modelYear != null && modelYear < 100;
if (isTwoDigit) {
return 2000 + modelYear;
} else {
return modelYear;
}
}

但是当用 NULL 调用时,这个失败并在 return 语句中出现 NPE。

private Integer convertTo4Digits(Integer modelYear) {
return (modelYear != null && modelYear < 100) ? (2000 + modelYear) : modelYear;
}

或者这是一个错误?我将 Eclipse Keple 与 JDK 1.7.0_04 一起使用

最佳答案

我想答案可以在chapter 15.25 of the JLS中找到

If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion (§5.1.7) to T, then the type of the conditional expression is T.

因此,当第二个或第三个操作数是原始类型时,表达式的类型是原始类型。因此,如果您传递一个 null 引用,分支 : modelYear 将被执行。但是由于一个操作数是原始的,所以它必须被拆箱。这会导致 NPE。

如果查看生成的字节码,您也可以看到这一点

private convertTo4Digits(Ljava/lang/Integer;)Ljava/lang/Integer;
L0
LINENUMBER 46 L0
ALOAD 1
IFNULL L1
ALOAD 1
INVOKEVIRTUAL java/lang/Integer.intValue()I
BIPUSH 100
IF_ICMPGE L1
SIPUSH 2000
ALOAD 1
INVOKEVIRTUAL java/lang/Integer.intValue()I
IADD
GOTO L2
L1
LINENUMBER 47 L1
ALOAD 1
INVOKEVIRTUAL java/lang/Integer.intValue()I
L2
LINENUMBER 46 L2
INVOKESTATIC java/lang/Integer.valueOf(I)Ljava/lang/Integer;
ARETURN

您自己的答案解决了问题,因为您将第二个操作数转换为 Integer

(modelYear != null && modelYear < 100) ? (Integer) (2000 + modelYear) : modelYear;

因此第二个和第三个操作数都不是原始类型。因此,我上面发布的 JLS 规则不适用,NPE 消失了。

关于java - NullPointerException 是从哪里来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22217918/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com