Java 内联条件语句中的空指针异常

Java 内联条件语句中的空指针异常,java,nullpointerexception,Java,Nullpointerexception,我得到一个奇怪的空指针异常,我不明白为什么。我用这个简单的测试代码缩小了范围,它在第二行抛出一个NPE: Long test = null; Long result = true ? test : -1L; 虽然此代码工作正常: Long result = true ? null : -1L; 通过不使用内联条件语句,这很容易避免,但是有人能向我解释为什么会发生这种情况吗?它试图取消引用测试的装箱,以获得long值,这是它无法做到的 我认为这是因为Lang封装了Lang。所以,在某种程度上,

我得到一个奇怪的空指针异常,我不明白为什么。我用这个简单的测试代码缩小了范围,它在第二行抛出一个NPE:

Long test = null;
Long result = true ? test : -1L;
虽然此代码工作正常:

Long result = true ? null : -1L;

通过不使用内联条件语句,这很容易避免,但是有人能向我解释为什么会发生这种情况吗?

它试图取消引用
测试
的装箱,以获得
long
值,这是它无法做到的

我认为这是因为Lang封装了Lang。所以,在某种程度上,您的表达式试图从long对象获取一些属性或long值。。像这样的事

请阅读此处的文档:


希望能有所帮助:)

我想这要归结为拆箱。以下代码将起作用:

Long two = true ? test : new Long(-1);

如果一个参数仅为-1,那么它将尝试取消装箱测试,以便将两者视为同一类型。取消装箱null将导致null指针异常。如果它在语句中特别为null,它将非常聪明,不会尝试取消装箱。

在第一个示例中,它认为右侧的表达式属于long类型(因为右侧的常量);因此,它使用自动装箱尝试获取test作为long的值,这将抛出和NPE


在第二个示例中,它始终将所有内容都视为参考值;没有自动装箱和碰撞。

成功了,谢谢。那太糟糕了。我不知道为什么Java觉得有必要强制它们是相同的类型。这就是三元运算符的工作方式,双方都必须强制转换为相同的类型,这样它就可以验证双方是否能够返回到您分配给的对象。