相关疑难解决方法(0)

NullPointerException通过Java三元运算符的自动装箱行为

NullPointerException几天我在三元运算符中意外地进行了类型转换,这让我感到非常奇怪.鉴于此(无用的示例)功能:

Integer getNumber() {
    return null;
}
Run Code Online (Sandbox Code Playgroud)

我希望编译后以下两个代码段完全相同:

Integer number;
if (condition) {
    number = getNumber();
} else {
    number = 0;
}
Run Code Online (Sandbox Code Playgroud)

Integer number = (condition) ? getNumber() : 0;
Run Code Online (Sandbox Code Playgroud)

.

事实证明,如果conditiontrue,if-statement工作正常,而第二个代码段中的三元操作抛出一个NullPointerException.似乎三元操作决定int在将结果自动装箱之前将两种选择都输入到一个Integer!?!事实上,如果我明确地转换0Integer,则异常消失.换一种说法:

Integer number = (condition) ? getNumber() : 0;
Run Code Online (Sandbox Code Playgroud)

是不一样的:

Integer number = (condition) ? getNumber() : (Integer) 0;
Run Code Online (Sandbox Code Playgroud)

.

因此,似乎三元运算符和等效if-else语句之间存在字节码差异(我没想到的事情).这提出了三个问题:为什么会有差异?这是三元实现中的错误还是有类型转换的原因?鉴于存在差异,三元运算的性能是否与等效的if陈述相比或多或少(我知道,差异不是很大,但仍然存在)?

java autoboxing nullpointerexception ternary

15
推荐指数
2
解决办法
1896
查看次数

Java的简写形式当其中一个返回的对象为null时,If语句返回NullPointerException

为什么此代码返回错误:java.lang.NullPointerException

Object obj = null;
Long lNull = null;
Long res = obj == null ? lNull : 10L;
Run Code Online (Sandbox Code Playgroud)

但是以下方式可以正常运行:

Object obj = null;
Long res = obj == null ? null : 10L;
Run Code Online (Sandbox Code Playgroud)

java null if-statement nullpointerexception

7
推荐指数
1
解决办法
395
查看次数

为什么返回null并分配给引用类型的三元条件表达式会导致NullPointerException?

我喜欢在java编程中使用三元条件表达式,但是我遇到了一个问题:

以下代码是一个小例子,但它显示了我找到的问题.

public class Example {

    public Example() {
        Double x = 0.0;    
        A a = new A();   
        x = a == null ? 0.0 : a.getY();   // Happens on this line    
        System.out.println(x);
    }

    class A {
        Double y = null;  
        private Double getY() {
            return y;
        }
    }

    public static void main(String[] args) {
        new Example();
    }

}
Run Code Online (Sandbox Code Playgroud)

是什么造成的NullPointerException

java if-statement nullpointerexception

3
推荐指数
2
解决办法
150
查看次数