gpt4 book ai didi

Java:一元 if - npe

转载 作者:行者123 更新时间:2023-12-01 19:13:02 27 4
gpt4 key购买 nike

为什么这段代码会导致NPE? Findbugs 给了我提示,这种情况可能会发生,而且有时确实会发生:-)

有什么想法吗?

public Integer whyAnNPE() {
return 1 == 2 ? 1 : 1 == 2 ? 1 : null;
}

最佳答案

编辑:当我写这个答案时,问题中的代码不存在。

这是另一种让它稍微清晰一点的方法:

public static Integer maybeCrash(boolean crash) {
return true ? (crash ? null : 1) : 0;
}

重要的一点是我们这里有两个条件表达式。由于 section 15.25 中指定的类型确定中的最后一个要点,内部的类型为 Integer .

此时,我们遇到了这样的情况:

public static Integer maybeCrash(boolean crash) {
Integer tmp = null;
return true ? tmp : 0;
}

现在对于剩余条件表达式,前面的要点适用,并且 binary numeric promotion被执行。这又调用unboxing作为第一步 - 结果失败了。

换句话说,这样的条件:

condition ? null-type : int

可能涉及将 int 装箱为 Integer,但条件如下:

condition ? Integer : int

可能涉及将 Integer 拆箱为 int

<小时/>

原始答案

这是一个相当简单的示例,它实际上是有效的 Java:

public class Test {
public static void main(String[] args) {
int x = args.length == 0 ? 1 : null;
}
}

这实际上是:

int tmp;
if (args.length == 0) {
tmp = 1;
} else {
Integer boxed = null;
tmp = boxed.intValue();
}

显然这里的拆箱步骤会很顺利。基本上,这是因为通过拆箱将 null 表达式隐式转换为 Integer,以及从 Integer 隐式转换为 int

关于Java:一元 if - npe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7808117/

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