Обработка null
значений в типах Boolean
На предыдущем этапе мы узнали о оберточном классе Boolean
. Одно из ключевых отличий между примитивным типом boolean
и оберточным классом Boolean
заключается в том, что переменная типа Boolean
может иметь значение null
, в то время как примитивный boolean
этого сделать не может. Обработка значений null
является важной частью программирования на Java, чтобы избежать ошибок NullPointerException
.
Ошибка NullPointerException
возникает, когда вы пытаетесь использовать переменную, которая в данный момент ссылается на null
, как если бы это был действительный объект. Например, вызов метода для объекта, равного null
, приведет к ошибке NullPointerException
.
При проверке, является ли объект Boolean
равным true
, необходимо быть осторожным, если объект может быть null
.
Давайте посмотрим, что произойдет, если мы попытаемся проверить null
объект Boolean
с использованием методов, которые мы узнали до сих пор.
-
Откройте файл HelloJava.java
в редакторе WebIDE.
-
Замените код следующим:
public class HelloJava {
public static void main(String[] args) {
Boolean nullableBoolean = null;
// Attempting to use == with null
if (nullableBoolean == true) {
System.out.println("This won't be printed.");
} else {
System.out.println("Using == with null Boolean.");
}
// Attempting to use .equals() with null
// This will cause a NullPointerException!
// if (nullableBoolean.equals(Boolean.TRUE)) {
// System.out.println("This will not be reached.");
// } else {
// System.out.println("This will not be reached either.");
// }
}
}
В этом коде:
Boolean nullableBoolean = null;
: Мы объявляем переменную типа Boolean
и явно устанавливаем ее значение в null
.
if (nullableBoolean == true)
: Мы используем оператор равенства ==
для сравнения null
объекта Boolean
с примитивным значением true
. При сравнении объекта Boolean
(даже если он равен null
) с примитивным boolean
, Java выполняет "распаковку" (unboxing). Она пытается преобразовать объект Boolean
в примитивный boolean
. Если объект Boolean
равен null
, этот процесс распаковки приводит к ошибке NullPointerException
.
- Закомментированная проверка с использованием
.equals()
также вызовет ошибку NullPointerException
, потому что вы пытаетесь вызвать метод .equals()
для объекта, равного null
(nullableBoolean
).
-
Сохраните файл.
-
Скомпилируйте программу:
javac HelloJava.java
-
Запустите программу:
java HelloJava
В терминале вы увидите сообщение об ошибке, указывающее на NullPointerException
:
Exception in thread "main" java.lang.NullPointerException
at HelloJava.main(HelloJava.java:6)
Это показывает, что прямое сравнение потенциально null
объекта Boolean
с примитивным boolean
с использованием ==
или вызов .equals()
для него может привести к ошибке NullPointerException
.
Для безопасной обработки потенциально null
объектов Boolean
вы всегда должны проверять, является ли объект null
перед попыткой распаковать его или вызвать методы для него.
Вот как вы можете безопасно проверить, является ли объект Boolean
равным true
:
-
Откройте файл HelloJava.java
в редакторе.
-
Замените код следующим:
public class HelloJava {
public static void main(String[] args) {
Boolean nullableBoolean = null;
Boolean trueBoolean = Boolean.TRUE;
Boolean falseBoolean = Boolean.FALSE;
// Safely check if nullableBoolean is true
if (nullableBoolean != null && nullableBoolean == true) {
System.out.println("nullableBoolean is true (safe check).");
} else {
System.out.println("nullableBoolean is not true or is null (safe check).");
}
// Safely check if trueBoolean is true
if (trueBoolean != null && trueBoolean == true) {
System.out.println("trueBoolean is true (safe check).");
} else {
System.out.println("trueBoolean is not true or is null (safe check).");
}
// Safely check if falseBoolean is true
if (falseBoolean != null && falseBoolean == true) {
System.out.println("falseBoolean is true (safe check).");
} else {
System.out.println("falseBoolean is not true or is null (safe check).");
}
// Alternative safe check using equals
if (Boolean.TRUE.equals(nullableBoolean)) {
System.out.println("nullableBoolean is true (safe equals check).");
} else {
System.out.println("nullableBoolean is not true or is null (safe equals check).");
}
if (Boolean.TRUE.equals(trueBoolean)) {
System.out.println("trueBoolean is true (safe equals check).");
} else {
System.out.println("trueBoolean is not true or is null (safe equals check).");
}
}
}
В этом обновленном коде:
if (nullableBoolean != null && nullableBoolean == true)
: Мы сначала проверяем, не является ли nullableBoolean
равным null
с использованием nullableBoolean != null
. Оператор &&
означает, что вторая часть условия (nullableBoolean == true
) будет оценена только в том случае, если первая часть (nullableBoolean != null
) равна true
. Это предотвращает ошибку NullPointerException
. Если nullableBoolean
равен null
, первая часть условия равна false
, и все условие равно false
без оценки второй части.
if (Boolean.TRUE.equals(nullableBoolean))
: Это еще один безопасный способ проверить, является ли объект Boolean
равным true
, даже если он равен null
. Вызывая метод .equals()
для известного не-null
объекта Boolean.TRUE
и передавая в качестве аргумента потенциально null
объект nullableBoolean
, мы избавляемся от ошибки NullPointerException
. Метод .equals()
разработан так, чтобы корректно обрабатывать аргументы, равные null
; Boolean.TRUE.equals(null)
просто вернет false
.
-
Сохраните файл.
-
Скомпилируйте программу:
javac HelloJava.java
-
Запустите программу:
java HelloJava
Вы должны увидеть следующий вывод:
nullableBoolean is not true or is null (safe check).
trueBoolean is true (safe check).
falseBoolean is not true or is null (safe check).
nullableBoolean is not true or is null (safe equals check).
trueBoolean is true (safe equals check).
Это демонстрирует, как безопасно проверить значение объекта Boolean
, даже если оно может быть null
, используя как проверку != null
в сочетании с == true
, так и метод Boolean.TRUE.equals()
.
Всегда помните о возможности наличия null
при работе с объектами Boolean
, чтобы избежать ошибок во время выполнения программы.