NullPointerException和拆箱

时间:2015-07-24 14:16:50

标签: java boxing autoboxing

我有两个几乎相同的代码片段(见下文)不能正常工作,但在我看来应该是一样的。

第一个是抛出NullPointerException buggy 版本,第二个版本正常工作。将getNewIndex结果分配给maxIdx时会发生NPE。问题是为什么?

错误版本抛出NPE:

Integer maxIdx = fieldName.equals(Fields.KEYS) ? 1 :
            getNewIndex(field.getGroup(), Fields.KEYS, Fields.PARAMS);

正确的工作版本:

Integer maxIdx = fieldName.equals(Fields.KEYS) ? 1 : null;
if (maxIdx == null) {
    maxIdx = getNewIndex(field.getGroup(), Fields.KEYS, Fields.PARAMS);
}

如果有人想知道的话。我正在使用Oracle Java 1.8.0_45

1 个答案:

答案 0 :(得分:7)

发生自动取消装箱是因为1将三元操作的结果设置为int。

Integer返回的getNewIndex为空,这会在取消装箱时导致NPE

您可以使用new Integer(1)来避免取消装箱。