为什么此分配会导致 NPE?
public class Npe {
static class Thing {
long value;
}
public static Map<Thing, Long> map;
public static void main(String[] args) {
Thing thing = new Thing();
method(null); // returns -1
method(thing); // returns 0
map = new HashMap<Thing, Long>();
method(null); // returns -1
method(thing); // NullPointerException thrown inside this method call
}
public static long method(Thing thing) {
if (thing == null) {
return -1;
}
Long v = (map == null) ? thing.value : map.get(thing); // NPE here
if (v == null) {
v = thing.value;
}
return v;
}
}
在第4次调用时,我得到一个抛在里面的指示行上。如果我从method()
NullPointerException
method()
Long v = (map == null) ? thing.value : map.get(thing);
自
Long v;
if (map == null) {
v = thing.value;
} else {
v = map.get(thing);
}
我得到没有,并且该方法的行为符合预期。问题是:为什么??NullPointerException
在我看来,编译器期望运算符的结果,以便它自动取消装箱(从降级到)调用的结果(可能会返回并因此抛出一个)。恕我直言,它应该期望操作员的结果和自动装箱(晋升为)相反。?
long
Long
long
map.get(thing)
null
NullPointerException
?
Long
long
Long
thing.value
更好的是,如果我重构这个语句:
Long v = (map == null) ? thing.value : map.get(thing);
到此(显式转换为):long
Long
Long v = (map == null) ? (Long)thing.value : map.get(thing);
我的IDE(IntelliJ)说强制转换是多余的,但编译的代码按预期工作,不会抛出NullPointerException
!:-D