为什么以下Java代码会抛出NullPointerException?
public static void main(String[] args) {
getInteger(null);
}
public static Integer getInteger(Number n) {
return (n == null || n instanceof Integer) ? (Integer)n : n.intValue();
}
编辑:我添加了括号以结束关于“我是否有时会返回布尔值”的混淆。
答案 0 :(得分:4)
信用完全归功于发现答案的@assylias。请改用此代码:
public static Integer getInteger(Number n) {
return (n == null || n instanceof Integer) ? (Integer)n : Integer.valueOf(n.intValue());
}
由于奇怪的装箱/取消装箱规则,因为n.intValue()
返回原始int
,编译器也会在表达式n
中将(Integer)n
拆箱到原语。 并且 null
无法分配给基元(只需在IDE中尝试这样做)。
NPE并不是因为null
被分配给一个原语(编译器不会这样做),但它是因为取消装箱是通过调用{{}来完成的。在这种情况下,在Integer.intValue()
引用上调用方法和方法。
答案 1 :(得分:0)
因为在这里:
return n == null || n instanceof Integer ? (Integer)n : n.intValue();
here
您正尝试将 n (为空)转换为整数。