Логическая ошибка в объекте и булевом переменном в JAVA
Я объявляю логическую переменную. Например Boolean dataVal=null;
Теперь, если я выполняю следующий сегмент кода:
if(dataVal)
System.out.println("\n\NULL value in dataVal: "+dataVal);
else
System.out.println("\n\nvalue in dataVal: "+dataVal);
Я получаю NULLPointerException. Ну, я знаю его очевидное, но мне нужно знать причину этого.
Ответы
Ответ 1
Когда вы вычисляете логическое значение объекта Boolean
, Java распаковывает значение (функция autoboxing, начиная с 1.5). Итак, реальный код: dataVal.booleanValue()
. Затем он бросает NullPointerException
. При любом бокс-значении unboxing нулевого объекта выдает это исключение.
До 1.5 вам нужно было вручную удалить значение: if (dataVal.booleanValue())
, чтобы оно было более очевидным (более подробное:)
Ответ 2
Потому что dataVal
отправляется на boolean
с помощью Boolean.booleanValue()
, который переводится на null.booleanValue()
, что приводит к исключению NullPointerException.
Ответ 3
Вы можете взглянуть на спецификацию проблем с распаковкой, описывается ваша ситуация здесь раздел 5.1.8 Конвертирование Unboxing: если значение r равно null, преобразование распаковки вызывает исключение NullPointerException
Это означает, что ваш if (/* Boolean object */) никогда не будет распакован в булевский примитивный тип и, следовательно, выбросит NPE, потому что вы делаете недопустимый if(null)
.
Кстати, распаковка будет работать, если у вас есть:
final Boolean booleanTest = new Boolean (true);
if (booleanTest) {
// Do something
}
Ответ 4
Boolean (class)!= boolean (примитивный тип).
Java пытается получить примитивное значение, вызывающее dataVal.booleanValue(). Поскольку dataVal имеет значение null, вы получаете исключение с нулевым указателем.
Ответ 5
if(null)
не является допустимым выражением, простым как это.
Под капюшонами виртуальная машина использует автоматический бокс... поэтому вы получаете NullPointerException.