Проверка Null Wrappers на примитивные значения - PullRequest
2 голосов
/ 07 февраля 2012
Integer i = null;
if (i == 3)

Почему вторая строка выше выдает NullPointerException, ИМХО, это имеет только одно значение: объект-оболочка i должен быть распакован, что приводит к исключению, например:

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(null);
int x = list.get(0);

РЕДАКТИРОВАТЬ: Можете ли вы предоставить мне какой-нибудь формат документа?

Ответы [ 5 ]

11 голосов
/ 07 февраля 2012

Он выбрасывает NPE, потому что компилятор делает для вас следующую «магию»:

Integer i = null;
if (i.intValue() == 3)

Очевидно, i.intValue() выбрасывает NPE, когда i равно null.

2 голосов
/ 07 февраля 2012

Когда вы пытаетесь сравнить упакованный номер с примитивным, упаковщик автоматически распаковывается. Если в этот момент оболочка имеет значение null, вы получите исключение NullPointerException. Это одна из распространенных ловушек системы автобокса (другая - низкая производительность, если вы зацикливаете / распаковываете номера в цикле)

2 голосов
/ 07 февраля 2012

Представьте, что класс-оболочка является объектом-держателем. Что-то вроде:

public class Integer {

private int intValue;

//getters and setters

}

Если указатель или ссылка на весь объект null, вы не можете получить значение для выполнения каких-либо операций boxing/unboxing.

Когда вы говорите:

if (i == 3)

unboxing происходит автоматически по ссылке null, отсюда и исключение.

0 голосов
/ 23 февраля 2017

Этого можно избежать, проверяя, является ли значение нулевым, перед его сравнением.

if (dto.getMethod() != null && dto.getMethod() == 0) // Safe check no NPE

Следующая страница содержит красивую оболочку, которую следует избегать NPE

http://www.javawiki.org/wiki/Avoid_NullPointerException_on_Primitive_Wrapper_Objects

0 голосов
/ 07 февраля 2012

Если не распаковать Integer, вы получите странное поведение, такое как

Integer i1 = -129;
Integer i2 = -129;
if (i1 != i2)
    System.out.println(i1 +" != " + i2);

или

Integer i1 = -129;
if (i1 != new Integer(-129))
    System.out.println(i1 +" != " + -129);

Это печатает

-129 != -129

, потому что ссылки , а не значения отличаются.

...