Обработка нулевых карт (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 перед вызовом методов на ней.