Проблема с логическим объектом и логической переменной в JAVA - PullRequest
21 голосов
/ 28 февраля 2012

Я объявляю логическую переменную. Например Boolean dataVal=null;
Теперь, если я выполню следующий сегмент кода:

if(dataVal)
    System.out.println("\n\NULL value in dataVal: "+dataVal);
else
    System.out.println("\n\nvalue in dataVal: "+dataVal);

Я получаю NullPointerException. Ну, я знаю, это очевидно, но мне нужно знать причину этого.

Ответы [ 6 ]

32 голосов
/ 28 февраля 2012

Когда вы оцениваете логическое значение объекта Boolean, Java распаковывает значение (функция автобоксирования, начиная с 1.5).Итак, настоящий код: dataVal.booleanValue().Тогда это бросает NullPointerException.При любом значении в штучной упаковке распаковка пустого объекта вызывает это исключение.

До версии 1.5 вам приходилось распаковывать значение вручную: if (dataVal.booleanValue()), чтобы оно было более очевидным (более подробным:)

14 голосов
/ 28 февраля 2012

Поскольку dataVal преобразуется в boolean с использованием Boolean.booleanValue(), которое переводится в null.booleanValue(), что приводит к исключению NullPointerException.

5 голосов
/ 28 февраля 2012

Вы можете взглянуть на спецификацию проблем с распаковкой, ваша ситуация описана здесь section 5.1.8 Распаковка конверсии : Если r равно нулю, распаковка конвертации выдает исключение NullPointerException

Это означает, что ваш if (/ * логический объект * /) никогда не будет распакован в логический тип примитива и, следовательно, выдает NPE, потому что вы делаете недопустимый if(null).

Кстати, распаковка будет работать, если у вас было:

final Boolean booleanTest = new Boolean (true);
if (booleanTest) {
    // Do something
}
1 голос
/ 28 февраля 2012

Boolean (класс)! = Логический (тип примитива).

Java пытается получить примитивное значение, вызывая dataVal.booleanValue ().Поскольку dataVal имеет значение null, вы получаете исключение нулевого указателя.

0 голосов
/ 22 мая 2018

Когда вы пытаетесь оценить значение логического объекта, jvm внутренне вызывает booleanValue () для этого объекта, так как вы присваиваете этому объекту значение null, оно вызывает исключение NullPointerException

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

if(null) не является допустимым выражением, просто так.

Под капотами виртуальная машина использует автобокс ... так что вы получите NullPointerException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...