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

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

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

Введение

В этом практическом занятии (лабораторной работе) вы научитесь безопасно проверять, является ли объект-обертка Boolean в Java равным null. В отличие от примитивного типа boolean, класс Boolean может иметь значение null, что может привести к NullPointerException, если это не обрабатывается правильно.

Мы рассмотрим различные методы обработки null-значений объектов Boolean, включая прямую проверку на null, комбинирование проверок на null и на истинность/ложность, а также использование класса Optional для более надежного обработки null-значений. По завершении этого практического занятия вы будете способны избегать распространенных ошибок при работе с объектами-обертками Boolean в Java.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java/BasicSyntaxGroup -.-> java/booleans("Booleans") java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/booleans -.-> lab-559932{{"Как проверить, является ли объект Boolean равным null в Java"}} java/variables -.-> lab-559932{{"Как проверить, является ли объект Boolean равным null в Java"}} java/if_else -.-> lab-559932{{"Как проверить, является ли объект Boolean равным null в Java"}} java/object_methods -.-> lab-559932{{"Как проверить, является ли объект Boolean равным null в Java"}} end

Проверка объекта-обертки Boolean на null

На этом этапе мы рассмотрим, как работать с объектами-обертками Boolean в Java, с особым вниманием уделив проверке на то, является ли объект Boolean равным null. В отличие от примитивного типа boolean, который может быть только true или false, класс-обертка Boolean может также иметь значение null. Это является распространенной причиной возникновения NullPointerException, если не обрабатывать это осторожно.

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

  1. Откройте каталог ~/project в проводнике файлов слева в WebIDE.

  2. Щелкните правой кнопкой мыши в пустом пространстве внутри каталога ~/project и выберите "Новый файл".

  3. Назовите новый файл BooleanCheck.java и нажмите Enter.

  4. Откройте файл BooleanCheck.java в редакторе кода.

  5. Скопируйте и вставьте следующий Java-код в редактор:

    public class BooleanCheck {
    
        public static void main(String[] args) {
            Boolean myBoolean = null;
    
            // Попытка напрямую использовать null-значение Boolean в условном операторе
            // вызовет NullPointerException
            // if (myBoolean) {
            //     System.out.println("This will not be printed if myBoolean is null.");
            // }
    
            // Правильный способ проверить, является ли объект-обертка Boolean равным null
            if (myBoolean == null) {
                System.out.println("myBoolean is null.");
            } else {
                System.out.println("myBoolean is not null.");
            }
    
            // Другой способ безопасно проверить булево значение
            if (Boolean.TRUE.equals(myBoolean)) {
                 System.out.println("myBoolean is true.");
            } else if (Boolean.FALSE.equals(myBoolean)) {
                 System.out.println("myBoolean is false.");
            } else {
                 System.out.println("myBoolean is null (checked using equals).");
            }
        }
    }
  6. Сохраните файл, нажав Ctrl + S (или Cmd + S на Mac).

  7. Теперь скомпилируем Java-программу. Откройте терминал внизу WebIDE. Убедитесь, что вы находитесь в каталоге ~/project. Если нет, введите cd ~/project и нажмите Enter.

  8. Скомпилируйте код с помощью команды javac:

    javac BooleanCheck.java

    Если нет ошибок, команда завершится без вывода. Это означает, что файл BooleanCheck.class был создан в каталоге ~/project.

  9. Запустите скомпилированную Java-программу с помощью команды java:

    java BooleanCheck
  10. В терминале вы должны увидеть следующий вывод:

    myBoolean is null.
    myBoolean is null (checked using equals).

Этот вывод подтверждает, что наш код правильно определил объект Boolean как null с использованием проверки == null и шаблона Boolean.TRUE.equals() / Boolean.FALSE.equals(). Закомментированный код показывает, что произойдет, если вы попытаетесь напрямую использовать null-значение Boolean в условном операторе if, что приведет к NullPointerException.

Понимание того, как безопасно обрабатывать null-значения объектов Boolean, является важным аспектом избежания распространенных ошибок в Java-программировании.

Комбинирование проверок на null и на истинность/ложность

На предыдущем этапе мы рассмотрели, как проверить, является ли объект Boolean равным null. Часто вам нужно проверить, является ли значение Boolean true, false или null. Эффективное и безопасное комбинирование этих проверок имеет важное значение.

Давайте модифицируем нашу программу BooleanCheck.java, чтобы продемонстрировать, как обработать все три возможных случая.

  1. Откройте файл BooleanCheck.java в редакторе кода, если он еще не открыт. Он должен находиться в каталоге ~/project.

  2. Замените существующий код в файле BooleanCheck.java следующим кодом. В этой версии есть примеры для null, true и false значений Boolean.

    public class BooleanCheck {
    
        public static void main(String[] args) {
            Boolean booleanValue1 = null;
            Boolean booleanValue2 = true;
            Boolean booleanValue3 = false;
    
            System.out.println("Checking booleanValue1 (null):");
            checkBoolean(booleanValue1);
    
            System.out.println("\nChecking booleanValue2 (true):");
            checkBoolean(booleanValue2);
    
            System.out.println("\nChecking booleanValue3 (false):");
            checkBoolean(booleanValue3);
        }
    
        // Вспомогательный метод для демонстрации проверок
        public static void checkBoolean(Boolean value) {
            if (value == null) {
                System.out.println("Value is null.");
            } else if (value) { // Это безопасно, так как мы уже проверили на null
                System.out.println("Value is true.");
            } else { // Если не null и не true, то оно должно быть false
                System.out.println("Value is false.");
            }
    
            // Еще один распространенный шаблон с использованием equals для безопасности
            System.out.print("Using equals: ");
            if (Boolean.TRUE.equals(value)) {
                 System.out.println("Value is true.");
            } else if (Boolean.FALSE.equals(value)) {
                 System.out.println("Value is false.");
            } else {
                 System.out.println("Value is null.");
            }
        }
    }

    В этом обновленном коде:

    • Мы определяем вспомогательный метод checkBoolean, который принимает объект Boolean в качестве входного параметра.
    • Внутри checkBoolean мы сначала проверяем, является ли value равным null с помощью value == null.
    • Если оно не равно null, то мы безопасно проверяем, является ли булево значение true с помощью value. Это работает, потому что Java автоматически распаковывает объект-обертку Boolean в примитивный тип boolean только в том случае, если обертка не равна null.
    • Если оно не равно null и не равно true, то оно должно быть false, что обрабатывается в блоке else.
    • Мы также снова используем шаблон Boolean.TRUE.equals(value) и Boolean.FALSE.equals(value), который является еще одним безопасным способом проверки значения, особенно полезным, когда вы хотите избежать потенциального NullPointerException, если объект, на котором вызывается метод equals, равен null.
  3. Сохраните файл (Ctrl + S или Cmd + S).

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

    javac BooleanCheck.java
  5. Запустите скомпилированную программу:

    java BooleanCheck
  6. Вы должны увидеть следующий вывод, демонстрирующий, как код обрабатывает каждый случай:

    Checking booleanValue1 (null):
    Value is null.
    Using equals: Value is null.
    
    Checking booleanValue2 (true):
    Value is true.
    Using equals: Value is true.
    
    Checking booleanValue3 (false):
    Value is false.
    Using equals: Value is false.

На этом этапе показаны надежные способы проверки состояния объекта-обертки Boolean, учитывающие значения null, true и false, что является фундаментальным навыком для написания безопасного и надежного Java-кода.

Работа с классом Optional

В современной Java (Java 8 и выше) класс Optional часто используется для представления значения, которое может быть либо присутствовать, либо отсутствовать. Это может помочь уменьшить количество NullPointerException в вашем коде, явно указывая на то, что значение может быть отсутствующим. Хотя Optional<Boolean> не является самым распространенным случаем использования, это хороший способ понять, как Optional можно применять к типам-оберткам, таким как Boolean.

На этом этапе мы модифицируем нашу программу, чтобы использовать Optional<Boolean> для обработки возможности отсутствия булевого значения.

  1. Откройте файл BooleanCheck.java в редакторе кода. Он должен находиться в каталоге ~/project.

  2. Замените существующий код следующим кодом, который использует Optional<Boolean>:

    import java.util.Optional;
    
    public class BooleanCheck {
    
        public static void main(String[] args) {
            Optional<Boolean> optionalBoolean1 = Optional.empty(); // Represents no value
            Optional<Boolean> optionalBoolean2 = Optional.of(true); // Represents the value true
            Optional<Boolean> optionalBoolean3 = Optional.of(false); // Represents the value false
    
            System.out.println("Checking optionalBoolean1 (empty):");
            checkOptionalBoolean(optionalBoolean1);
    
            System.out.println("\nChecking optionalBoolean2 (true):");
            checkOptionalBoolean(optionalBoolean2);
    
            System.out.println("\nChecking optionalBoolean3 (false):");
            checkOptionalBoolean(optionalBoolean3);
        }
    
        // A helper method to demonstrate checking Optional<Boolean>
        public static void checkOptionalBoolean(Optional<Boolean> optionalValue) {
            if (optionalValue.isPresent()) {
                // Get the boolean value if present
                Boolean value = optionalValue.get();
                if (value) {
                    System.out.println("Value is present and true.");
                } else {
                    System.out.println("Value is present and false.");
                }
            } else {
                System.out.println("Value is not present (empty Optional).");
            }
    
            // Another way using orElse
            System.out.print("Using orElse(false): ");
            boolean result = optionalValue.orElse(false);
            System.out.println("Result: " + result);
    
            // Using ifPresent
            System.out.print("Using ifPresent: ");
            optionalValue.ifPresent(val -> System.out.println("Value is present: " + val));
            if (!optionalValue.isPresent()) {
                 System.out.println("Value is not present.");
            }
        }
    }

    В этой версии:

    • Мы импортируем класс java.util.Optional.
    • Мы создаем объекты Optional<Boolean> с использованием Optional.empty() для отсутствующего значения и Optional.of() для присутствующего значения.
    • Метод checkOptionalBoolean теперь принимает Optional<Boolean>.
    • Мы используем optionalValue.isPresent() для проверки наличия значения.
    • Если значение присутствует, мы извлекаем его с помощью optionalValue.get(). Примечание: Вызывайте get() только после проверки isPresent(), в противном случае вы получите NoSuchElementException.
    • Мы также демонстрируем использование orElse(false), которое предоставляет значение по умолчанию (false в данном случае), если Optional пуст.
    • ifPresent() позволяет выполнить действие только в том случае, если значение присутствует.
  3. Сохраните файл (Ctrl + S или Cmd + S).

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

    javac BooleanCheck.java
  5. Запустите скомпилированную программу:

    java BooleanCheck
  6. Вы должны увидеть следующий вывод:

    Checking optionalBoolean1 (empty):
    Value is not present (empty Optional).
    Using orElse(false): Result: false
    Using ifPresent: Value is not present.
    
    Checking optionalBoolean2 (true):
    Value is present and true.
    Using orElse(false): Result: true
    Using ifPresent: Value is present: true
    
    Checking optionalBoolean3 (false):
    Value is present and false.
    Using orElse(false): Result: false
    Using ifPresent: Value is present: false

Этот вывод показывает, как Optional<Boolean> можно использовать для явной обработки наличия или отсутствия булевого значения, предоставляя более надежный способ работы с потенциально отсутствующими данными по сравнению с использованием просто nullable Boolean.

Резюме

В этом практическом занятии (лабораторной работе) мы научились проверять, является ли объект-обертка Boolean равным null в Java. Мы изучили разницу между примитивным типом boolean и классом-оберткой Boolean, подчеркнув возможность возникновения NullPointerException при работе с null объектами Boolean. Мы продемонстрировали правильный способ проверки на null с использованием оператора равенства (== null) и также показали, как безопасно проверить булево значение с помощью метода equals() у Boolean.TRUE и Boolean.FALSE. Эти техники являются важными для предотвращения ошибок времени выполнения при работе с nullable объектами Boolean.