为什么这个Java代码会抛出NullPointerException?

时间:2015-12-03 07:02:46

标签: java nullpointerexception

为什么以下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();
}

编辑:我添加了括号以结束关于“我是否有时会返回布尔值”的混淆。

2 个答案:

答案 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 (为空)转换为整数。