Обработка null
-ссылок на Map
На предыдущих этапах мы работали с картами, которые были либо пустыми, либо содержали элементы. Однако важно рассмотреть, что произойдет, если переменная типа Map
имеет значение null
. Ссылка null
означает, что переменная не указывает на какой-либо объект в памяти. Попытка вызвать метод, такой как isEmpty()
или size()
, для Map
с null
-ссылкой приведет к NullPointerException
, что является распространенной ошибкой в Java.
На этом этапе мы научимся безопасно обрабатывать потенциальные null
-ссылки на карты перед попыткой проверить их пустоту или размер.
Откройте файл MapCheck.java
в редакторе WebIDE еще раз.
Добавим код, демонстрирующий и обрабатывающий null
-карту. Измените метод main
, добавив в него следующее:
import java.util.HashMap;
import java.util.Map;
public class MapCheck {
public static void main(String[] args) {
// Create an empty Map
Map<String, Integer> emptyMap = new HashMap<>();
// Check the size of the empty map using size()
int emptySize = emptyMap.size();
// Print the result
System.out.println("Size of the empty map: " + emptySize);
// Create a non-empty Map
Map<String, Integer> nonEmptyMap = new HashMap<>();
nonEmptyMap.put("one", 1);
nonEmptyMap.put("two", 2);
nonEmptyMap.put("three", 3); // Add one more element
// Check the size of the non-empty map
int nonEmptySize = nonEmptyMap.size();
// Print the result
System.out.println("Size of the non-empty map: " + nonEmptySize);
// Declare a Map variable but don't initialize it (it will be null)
Map<String, Integer> nullMap = null;
// --- Handling the null map ---
// Check if the map is null before calling methods
if (nullMap == null) {
System.out.println("The nullMap is null.");
} else {
// This block will not be executed for nullMap
System.out.println("Is the nullMap empty? " + nullMap.isEmpty());
System.out.println("Size of the nullMap: " + nullMap.size());
}
// A safer way to check if a map is empty (handles null)
boolean isNullMapEmpty = (nullMap == null || nullMap.isEmpty());
System.out.println("Is the nullMap considered empty (including null)? " + isNullMapEmpty);
// A safer way to get the size (handles null)
int nullMapSize = (nullMap == null) ? 0 : nullMap.size();
System.out.println("Size of the nullMap (handling null): " + nullMapSize);
}
}
Вот что мы добавили:
Map<String, Integer> nullMap = null;
: Эта строка объявляет переменную типа Map
, но явно устанавливает ее значение в null
.
if (nullMap == null) { ... }
: Это ключевой момент для обработки null
. Мы проверяем, является ли переменная nullMap
равной null
перед попыткой вызвать на ней какие-либо методы. Если она равна null
, мы выводим сообщение. Если бы она не была null
, выполнился бы блок else
, и мы могли бы безопасно вызвать методы isEmpty()
и size()
.
boolean isNullMapEmpty = (nullMap == null || nullMap.isEmpty());
: Это распространенная конструкция для проверки, является ли карта фактически "пустой", включая случай, когда сама ссылка на карту равна null
. Оператор ||
(логическое ИЛИ) означает, что если nullMap == null
истинно, то вся выражение истинно, и nullMap.isEmpty()
даже не вычисляется, предотвращая NullPointerException
.
int nullMapSize = (nullMap == null) ? 0 : nullMap.size();
: Здесь используется тернарный оператор (? :
) для безопасного получения размера. Если nullMap
равно null
, то выражение оценивается как 0
. В противном случае оно оценивается как nullMap.size()
.
Сохраните файл MapCheck.java
(Ctrl+S или Cmd+S).
Скомпилируйте измененный код в терминале:
javac MapCheck.java
Запустите программу:
java MapCheck
Вы должны увидеть вывод, похожий на следующий:
Size of the empty map: 0
Size of the non-empty map: 3
The nullMap is null.
Is the nullMap considered empty (including null)? true
Size of the nullMap (handling null): 0
Обратите внимание, что строки внутри блока else
для nullMap
не были выполнены, и мы успешно проверили, является ли nullMap
равным null
, и получили его размер (считаем null
как размер 0) без возникновения ошибки.
Обработка null
-ссылок очень важна в Java для предотвращения NullPointerException
и создания более надежных программ. Всегда проверяйте, может ли переменная быть равной null
перед вызовом методов на ней.