Как проверить, является ли ArrayList в Java равным null

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) мы рассмотрим различные методы проверки на null объекта ArrayList в Java. Обработка нулевых значений является фундаментальным аспектом надежного программирования на Java, и понимание того, как это делать правильно, необходимо для предотвращения ошибок NullPointerException.

Мы начнем с рассмотрения самого простого метода, который использует оператор равенства (==) для непосредственной проверки на null. Затем мы узнаем, как сочетать проверки на null с проверками на пустой список, чтобы эффективно обрабатывать оба сценария. Наконец, мы рассмотрим использование класса Optional, современной функции Java, которая предоставляет более выразительный и безопасный способ обработки потенциально нулевых значений.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/StringManipulationGroup -.-> java/strings("Strings") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/variables -.-> lab-560005{{"Как проверить, является ли ArrayList в Java равным null"}} java/if_else -.-> lab-560005{{"Как проверить, является ли ArrayList в Java равным null"}} java/strings -.-> lab-560005{{"Как проверить, является ли ArrayList в Java равным null"}} java/classes_objects -.-> lab-560005{{"Как проверить, является ли ArrayList в Java равным null"}} java/object_methods -.-> lab-560005{{"Как проверить, является ли ArrayList в Java равным null"}} java/string_methods -.-> lab-560005{{"Как проверить, является ли ArrayList в Java равным null"}} end

Проверка на null с использованием оператора равенства

На этом этапе мы рассмотрим самый простой способ проверить, содержит ли переменная в Java значение null: использование оператора равенства (==). Понимание того, как обрабатывать null, является важной частью программирования на Java для предотвращения ошибок.

В Java null - это специальное значение, которое показывает, что переменная не ссылается на какой-либо объект. Можно представить это как пустую коробку – коробка есть, но внутри нее ничего нет. Если вы попытаетесь использовать переменную, которая равна null, как если бы она ссылалась на объект (например, вызвать метод у нее), то получите ошибку NullPointerException, которая является очень распространенной ошибкой в Java.

Оператор равенства (==) используется для сравнения двух значений. При сравнении ссылки на объект с null, оператор == проверяет, указывает ли ссылка на значение null.

Давайте создадим простую Java-программу, чтобы продемонстрировать это.

  1. Откройте файл HelloJava.java в редакторе WebIDE, если он еще не открыт.

  2. Замените все содержимое файла следующим кодом:

    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, чтобы увидеть разницу.
  3. Сохраните файл (Ctrl+S или Cmd+S).

  4. Скомпилируйте программу с использованием команды javac в терминале:

    javac HelloJava.java

    Если нет ошибок, компиляция завершится без сообщений.

  5. Запустите скомпилированную программу с использованием команды 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, чтобы продемонстрировать совмещение этих проверок.

  1. Откройте файл HelloJava.java в редакторе WebIDE.

  2. Замените текущий код следующим:

    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, это привело бы к ошибке.
  3. Сохраните файл (Ctrl+S или Cmd+S).

  4. Скомпилируйте программу в терминале:

    javac HelloJava.java
  5. Запустите программу:

    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.

  1. Откройте файл HelloJava.java в редакторе WebIDE.

  2. Замените текущий код следующим:

    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 пуст, он возвращает указанное значение по умолчанию. Это безопасный и удобный способ предоставить резервное значение.
  3. Сохраните файл (Ctrl+S или Cmd+S).

  4. Скомпилируйте программу:

    javac HelloJava.java
  5. Запустите программу:

    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 для более современного и безопасного подхода к обработке потенциально отсутствующих значений, что способствует созданию более читаемого и менее ошибочного кода.