Введение
В этом практическом занятии (лабораторной работе) мы рассмотрим различные методы проверки на null объекта ArrayList в Java. Обработка нулевых значений является фундаментальным аспектом надежного программирования на Java, и понимание того, как это делать правильно, необходимо для предотвращения ошибок NullPointerException.
Мы начнем с рассмотрения самого простого метода, который использует оператор равенства (==) для непосредственной проверки на null. Затем мы узнаем, как сочетать проверки на null с проверками на пустой список, чтобы эффективно обрабатывать оба сценария. Наконец, мы рассмотрим использование класса Optional, современной функции Java, которая предоставляет более выразительный и безопасный способ обработки потенциально нулевых значений.
Проверка на null с использованием оператора равенства
На этом этапе мы рассмотрим самый простой способ проверить, содержит ли переменная в Java значение null: использование оператора равенства (==). Понимание того, как обрабатывать null, является важной частью программирования на Java для предотвращения ошибок.
В Java null - это специальное значение, которое показывает, что переменная не ссылается на какой-либо объект. Можно представить это как пустую коробку – коробка есть, но внутри нее ничего нет. Если вы попытаетесь использовать переменную, которая равна null, как если бы она ссылалась на объект (например, вызвать метод у нее), то получите ошибку NullPointerException, которая является очень распространенной ошибкой в Java.
Оператор равенства (==) используется для сравнения двух значений. При сравнении ссылки на объект с null, оператор == проверяет, указывает ли ссылка на значение null.
Давайте создадим простую Java-программу, чтобы продемонстрировать это.
Откройте файл
HelloJava.javaв редакторе WebIDE, если он еще не открыт.Замените все содержимое файла следующим кодом:
public class HelloJava { public static void main(String[] args) { String message = null; // Объявление переменной типа String и установка ее в null // Проверка, является ли переменная message равной null if (message == null) { System.out.println("The message is null."); } else { System.out.println("The message is not null: " + message); } message = "Hello, World!"; // Присваивание объекта String переменной // Повторная проверка после присвоения значения if (message == null) { System.out.println("The message is null."); } else { System.out.println("The message is not null: " + message); } } }В этом коде:
- Мы объявляем переменную типа
Stringс именемmessageи изначально устанавливаем ее вnull. - Мы используем оператор
ifс условиемmessage == nullдля проверки, является ли переменнаяnull. - Мы выводим сообщение, которое показывает, является ли переменная
nullили нет. - Затем мы присваиваем переменной
messageреальное значение типаString("Hello, World!"). - Мы снова выполняем проверку на
null, чтобы увидеть разницу.
- Мы объявляем переменную типа
Сохраните файл (Ctrl+S или Cmd+S).
Скомпилируйте программу с использованием команды
javacв терминале:javac HelloJava.javaЕсли нет ошибок, компиляция завершится без сообщений.
Запустите скомпилированную программу с использованием команды
java:java HelloJavaВы должны увидеть следующий вывод:
The message is null. The message is not null: Hello, World!Этот вывод подтверждает, что проверка
== nullправильно определила, когда переменнаяmessageбыла равнаnull, и когда у нее было значение.
Использование оператора равенства (==) является самым простым способом проверить на null в Java. Однако важно помнить, что этот способ работает только для проверки, является ли ссылка null. Он не проверяет, является ли строка пустой (не содержит символов, как ""). В следующем шаге мы рассмотрим, как обрабатывать пустые строки.
Комбинирование проверок на null и пустоту
На предыдущем этапе мы узнали, как проверить, является ли переменная null с использованием оператора ==. Однако в Java, особенно при работе с объектами String, часто необходимо проверить не только, является ли переменная null, но и, является ли она "пустой". Пустая строка - это объект String, который существует, но не содержит символов (например, ""). С другой стороны, строка, равная null, означает, что переменная вообще не ссылается на какой-либо объект String.
Попытка вызвать методы, такие как isEmpty() или length(), для строки, равной null, приведет к ошибке NullPointerException. Поэтому, когда вы хотите обрабатывать как null, так и пустые строки одинаково (например, считать их "пустыми" или "отсутствующими"), вам нужно проверить оба условия.
Самый распространенный способ сделать это - сначала проверить, является ли строка null, а затем, если она не null, проверить, является ли она пустой с использованием метода isEmpty().
Давайте модифицируем нашу программу HelloJava.java, чтобы продемонстрировать совмещение этих проверок.
Откройте файл
HelloJava.javaв редакторе WebIDE.Замените текущий код следующим:
public class HelloJava { public static void main(String[] args) { String text1 = null; String text2 = ""; // An empty string String text3 = "Hello"; // A non-empty string System.out.println("Checking text1 (null):"); if (text1 == null || text1.isEmpty()) { System.out.println("text1 is null or empty."); } else { System.out.println("text1 is not null and not empty: " + text1); } System.out.println("\nChecking text2 (empty):"); // It's crucial to check for null first! if (text2 == null || text2.isEmpty()) { System.out.println("text2 is null or empty."); } else { System.out.println("text2 is not null and not empty: " + text2); } System.out.println("\nChecking text3 (not empty):"); if (text3 == null || text3.isEmpty()) { System.out.println("text3 is null or empty."); } else { System.out.println("text3 is not null and not empty: " + text3); } } }В этом обновленном коде:
- Мы вводим три переменные типа
String:text1(равнаnull),text2(пустая) иtext3(не пустая). - Мы используем логический оператор ИЛИ (
||) для объединения проверки наnull(text == null) и проверки на пустоту (text.isEmpty()). - Условие
text == null || text.isEmpty()будет истинным, еслиtextравноnullили еслиtextне равноnullиtext.isEmpty()возвращаетtrue. - Важно: Проверка на
null(text == null) должна идти первой в условии||. Еслиtextравноnull, первая часть условия||(text == null) будет истинной, и Java использует "короткую цепочку вычислений" для пропуска второй части (text.isEmpty()), тем самым предотвращая ошибкуNullPointerException. Если бы проверкаisEmpty()шла первой иtextбыло равноnull, это привело бы к ошибке.
- Мы вводим три переменные типа
Сохраните файл (Ctrl+S или Cmd+S).
Скомпилируйте программу в терминале:
javac HelloJava.javaЗапустите программу:
java HelloJavaВы должны увидеть следующий вывод:
Checking text1 (null): text1 is null or empty. Checking text2 (empty): text2 is null or empty. Checking text3 (not empty): text3 is not null and not empty: HelloЭтот вывод показывает, что наша совмещенная проверка правильно определила как строку, равную
null(text1), так и пустую строку (text2) как "равнуюnullили пустую", при этом правильно определила непустую строку (text3).
Эта совмещенная проверка (string == null || string.isEmpty()) является очень распространенным шаблоном в Java, когда вам нужно обрабатывать как null, так и пустые строки. Многие библиотеки также предоставляют вспомогательные методы для этого, например, StringUtils.isEmpty() или StringUtils.isBlank() (который также проверяет на наличие пробелов) в Apache Commons Lang, но понимание базовой совмещенной проверки является фундаментальным.
Использование Optional для безопасной обработки
Хотя проверка на null и пустые строки с помощью == null || isEmpty() является эффективной, начиная с Java 8 был введен класс Optional как способ более явно и безопасно обрабатывать потенциально отсутствующие значения. Optional - это контейнерный объект, который может содержать или не содержать не-null значение. Используя Optional, вы можете избежать ошибок NullPointerException и сделать свой код более читаемым, ясно показывая, что значение может отсутствовать.
Optional не полностью заменяет проверки на null, но он предоставляет более функциональный и выразительный способ обработки ситуаций, когда значение может отсутствовать.
Давайте посмотрим, как использовать Optional в нашей программе HelloJava.java.
Откройте файл
HelloJava.javaв редакторе WebIDE.Замените текущий код следующим:
import java.util.Optional; public class HelloJava { public static void main(String[] args) { String text1 = null; String text2 = ""; String text3 = "Hello"; // Creating Optional objects Optional<String> optionalText1 = Optional.ofNullable(text1); Optional<String> optionalText2 = Optional.ofNullable(text2); Optional<String> optionalText3 = Optional.ofNullable(text3); System.out.println("Checking optionalText1 (from null):"); // Check if a value is present if (optionalText1.isPresent()) { System.out.println("optionalText1 contains a value: " + optionalText1.get()); } else { System.out.println("optionalText1 is empty (no value present)."); } System.out.println("\nChecking optionalText2 (from empty string):"); if (optionalText2.isPresent()) { System.out.println("optionalText2 contains a value: " + optionalText2.get()); } else { System.out.println("optionalText2 is empty (no value present)."); } System.out.println("\nChecking optionalText3 (from non-empty string):"); if (optionalText3.isPresent()) { System.out.println("optionalText3 contains a value: " + optionalText3.get()); } else { System.out.println("optionalText3 is empty (no value present)."); } // Using orElse() to provide a default value if the Optional is empty String valueOrDefault1 = optionalText1.orElse("Default Value 1"); String valueOrDefault2 = optionalText2.orElse("Default Value 2"); String valueOrDefault3 = optionalText3.orElse("Default Value 3"); System.out.println("\nUsing orElse():"); System.out.println("Value from optionalText1: " + valueOrDefault1); System.out.println("Value from optionalText2: " + valueOrDefault2); System.out.println("Value from optionalText3: " + valueOrDefault3); } }Разберем новые части кода:
import java.util.Optional;: Мы должны импортировать классOptional.Optional.ofNullable(text);: Это рекомендуемый способ создания объектаOptionalиз переменной, которая может бытьnull. Еслиtextравноnull, создается пустойOptional. Еслиtextне равноnull, создаетсяOptional, содержащий значениеtext.optionalText.isPresent(): Этот метод возвращаетtrue, еслиOptionalсодержит не-nullзначение, иfalseв противном случае. Это безопасный способ проверить, присутствует ли значение, прежде чем пытаться получить к нему доступ.optionalText.get(): Этот метод возвращает значение, содержащееся вOptional. Используйте этот метод с осторожностью! ЕслиOptionalпуст (то естьisPresent()возвращаетfalse), вызовget()вызовет ошибкуNoSuchElementException. В общем, лучше использовать другие методыOptional, такие какorElse(),orElseGet()илиifPresent().optionalText.orElse("Default Value"): Этот метод возвращает значение, содержащееся вOptional, если оно присутствует. ЕслиOptionalпуст, он возвращает указанное значение по умолчанию. Это безопасный и удобный способ предоставить резервное значение.
Сохраните файл (Ctrl+S или Cmd+S).
Скомпилируйте программу:
javac HelloJava.javaЗапустите программу:
java HelloJavaВы должны увидеть вывод, похожий на следующий:
Checking optionalText1 (from null): optionalText1 is empty (no value present). Checking optionalText2 (from empty string): optionalText2 contains a value: Checking optionalText3 (from non-empty string): optionalText3 contains a value: Hello Using orElse(): Value from optionalText1: Default Value 1 Value from optionalText2: Value from optionalText3: HelloОбратите внимание, что
optionalText1(созданный изnull) правильно определен как пустой.optionalText2(созданный из пустой строки"") не является пустым в смыслеOptional, потому что он содержит валидный объектString(даже если эта строка пуста).optionalText3содержит строку "Hello". Примеры с использованиемorElse()показывают, как легко можно предоставить значения по умолчанию, когдаOptionalпуст.
Использование Optional может сделать ваш код более надежным и выразительным при работе с значениями, которые могут отсутствовать. Он побуждает вас думать о возможности отсутствия значения и обрабатывать его явно, уменьшая вероятность неожиданных ошибок NullPointerException.
Резюме
В этом практическом занятии (лабораторной работе) мы изучили фундаментальный способ проверки, является ли переменная, в частности ArrayList, равной null в Java с использованием оператора равенства (==). Мы поняли, что null означает отсутствие ссылки на объект и что попытка использовать переменную, равную null, может привести к ошибке NullPointerException. Мы отработали эту базовую проверку на null с помощью простой Java-программы.
Мы также рассмотрели более надежные методы обработки потенциально null значений и пустых коллекций. Это включало в себя совмещение проверок на null и пустоту, чтобы учесть оба условия, а также использование класса Optional для более современного и безопасного подхода к обработке потенциально отсутствующих значений, что способствует созданию более читаемого и менее ошибочного кода.



