我得到了一个奇怪的空指针异常,我无法理解为什么。我用这个简单的测试代码缩小了它,它在第二行抛出了一个NPE:
Long test = null;
Long result = true ? test : -1L;
虽然这段代码运行良好:
Long result = true ? null : -1L;
这很容易通过不使用内联条件语句来避免,但任何人都可以向我解释为什么会发生这种情况吗?
答案 0 :(得分:5)
我认为这归结为拆箱。以下代码将起作用:
Long two = true ? test : new Long(-1);
如果一个参数只是-1,那么它将尝试取消装箱测试,因此它将两者都视为相同的类型。取消装箱null将导致空指针异常。如果它在语句中特别为null,那么它将足够聪明,不会尝试取消装箱。
答案 1 :(得分:2)
它试图取消引用引用test
以获取long
值,但它无法执行此操作。
答案 2 :(得分:0)
我认为这是因为Lang封装了lang。所以,某种程度上,你的表达式试图获得一些属性,或者来自Long对象的长值......就像那样......
请阅读此处的文档:http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Long.html
希望它有所帮助:)
答案 3 :(得分:0)
在第一个例子中,它认为右边的表达式是long类型(因为右边的常量);因此,自动装箱试图将测试的值作为一个长的,抛出和NPE。
在第二个例子中,它将所有内容视为参考值;没有自动装箱,也没有崩溃。