Как проверить, является ли объект Character в Java null

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

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

Введение

В этом лабораторном занятии мы рассмотрим, как обрабатывать потенциальные значения null при работе с оберточным классом Character в Java. В отличие от примитивного типа char, объект Character может быть null, и если не обработать это, могут возникнуть ошибки NullPointerException. Мы научимся проверять, является ли объект Character равным null, комбинировать проверки на null с другими проверками свойств символов и использовать класс Optional для более безопасной обработки null значений.

С помощью практических примеров вы получите практический опыт написания надежного кода на Java, который эффективно управляет null объектами Character, предотвращая распространенные ошибки во время выполнения и повышая надежность ваших приложений.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/oop("OOP") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/wrapper_classes("Wrapper Classes") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/if_else -.-> lab-559940{{"Как проверить, является ли объект Character в Java null"}} java/oop -.-> lab-559940{{"Как проверить, является ли объект Character в Java null"}} java/exceptions -.-> lab-559940{{"Как проверить, является ли объект Character в Java null"}} java/wrapper_classes -.-> lab-559940{{"Как проверить, является ли объект Character в Java null"}} java/object_methods -.-> lab-559940{{"Как проверить, является ли объект Character в Java null"}} end

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

На этом этапе мы рассмотрим, как обрабатывать потенциальные значения null при работе с оберточным классом Character в Java. В то время как примитивные типы char не могут быть null, оберточный класс Character, являясь объектом, может быть таковым. Обработка значений null является важной частью программирования, чтобы избежать ошибок NullPointerException, которые часто встречаются в Java и могут привести к аварийному завершению программы.

Мы начнем с создания простой Java-программы, которая демонстрирует, как может возникнуть ошибка NullPointerException, когда вы пытаетесь вызвать метод для объекта Character, равного null.

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

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

    public class HelloJava {
        public static void main(String[] args) {
            Character myChar = null;
    
            // Эта строка вызовет ошибку NullPointerException, если myChar равно null
            // System.out.println("Is myChar a letter? " + Character.isLetter(myChar));
        }
    }

    В этом коде:

    • Мы объявляем переменную Character с именем myChar и явно устанавливаем ее значение в null.
    • Закомментированная строка System.out.println("Is myChar a letter? " + Character.isLetter(myChar)); пытается вызвать статический метод Character.isLetter() с аргументом null. Хотя Character.isLetter() является статическим методом, передача ему объекта Character, равного null, все равно приведет к ошибке NullPointerException, так как метод внутренне пытается преобразовать объект Character в примитивный тип char, что невозможно для null.
  3. Сохраните файл (Ctrl+S или Cmd+S).

  4. Теперь скомпилируем программу. Откройте терминал внизу WebIDE и выполните следующую команду:

    javac HelloJava.java

    Если компиляция прошла успешно, вы не увидите никакого вывода.

  5. Теперь попробуем запустить программу. В терминале выполните следующую команду:

    java HelloJava

    Поскольку строка, которая могла бы вызвать ошибку, закомментирована, программа запустится без вывода и ошибок. Это показывает, что просто объявление объекта Character как null не вызывает немедленной проблемы; проблема возникает, когда вы пытаетесь выполнять операции с ним.

На следующем этапе мы раскомментируем проблемную строку и увидим ошибку NullPointerException.

Комбинирование проверок на null и на букву

На предыдущем этапе мы увидели, как может возникнуть ошибка NullPointerException при работе с объектами Character. Теперь раскомментируем строку, которая вызывает ошибку, и посмотрим, как проявляется исключение. Затем мы научимся распространенному способу предотвратить это, комбинируя проверку на null с проверкой на букву.

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

  2. Раскомментируйте строку, которая вызывает метод Character.isLetter(). Теперь ваш код должен выглядеть так:

    public class HelloJava {
        public static void main(String[] args) {
            Character myChar = null;
    
            // Эта строка вызовет ошибку NullPointerException, если myChar равно null
            System.out.println("Is myChar a letter? " + Character.isLetter(myChar));
        }
    }
  3. Сохраните файл (Ctrl+S или Cmd+S).

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

    javac HelloJava.java

    Опять же, если компиляция прошла успешно, вы не увидите никакого вывода.

  5. Теперь запустите программу:

    java HelloJava

    Вы должны увидеть вывод, похожий на следующий, который указывает на ошибку NullPointerException:

    Exception in thread "main" java.lang.NullPointerException
        at java.base/java.lang.Character.isLetter(Character.java:xxxx)
        at HelloJava.main(HelloJava.java:x)

    Эта ошибка возникает потому, что myChar равно null, и метод Character.isLetter() не может работать с объектом, равным null.

  6. Чтобы предотвратить эту ошибку NullPointerException, мы можем добавить проверку, является ли myChar равным null перед тем, как попытаться вызвать метод Character.isLetter(). Для этого можно использовать оператор if. Измените файл HelloJava.java, добавив такую проверку:

    public class HelloJava {
        public static void main(String[] args) {
            Character myChar = null;
    
            if (myChar != null && Character.isLetter(myChar)) {
                System.out.println("myChar is a letter.");
            } else {
                System.out.println("myChar is not a letter or is null.");
            }
        }
    }

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

    • Мы используем оператор if с двумя условиями, объединенными оператором && (логическое И).
    • Первое условие, myChar != null, проверяет, не является ли myChar равным null.
    • Второе условие, Character.isLetter(myChar), проверяет, является ли myChar буквой.
    • Оператор && имеет "короткую цепочку". Это означает, что если первое условие (myChar != null) ложно, второе условие (Character.isLetter(myChar)) не вычисляется. Это предотвращает ошибку NullPointerException, так как мы пытаемся вызвать метод Character.isLetter() только в том случае, если myChar не равно null.
  7. Сохраните файл.

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

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

    java HelloJava

    На этот раз программа должна запуститься без ошибок и вывести:

    myChar is not a letter or is null.

    Это происходит потому, что myChar равно null, поэтому первое условие в операторе if (myChar != null) ложно, и выполняется блок else.

Подход, заключающийся в проверке на null перед доступом к методам или свойствам объекта, является фундаментальной техникой в Java для избежания ошибок NullPointerException.

Использование Optional для безопасности при работе с null

На предыдущем этапе мы узнали, как предотвратить ошибку NullPointerException, явно проверяя, является ли объект null перед его использованием. Хотя этот подход эффективен, он иногда может привести к тому, что код будет перегружен проверками на null. В Java 8 был введен класс Optional как способ более функционального и выразительного управления потенциально null значениями.

Optional представляет собой контейнерный объект, который может содержать или не содержать не-null значение. Если значение присутствует, метод isPresent() возвращает true, а метод get() возвращает это значение. Если значение отсутствует, объект считается пустым, и метод isPresent() возвращает false. Вызов метода get() для пустого объекта Optional вызывает исключение NoSuchElementException.

Давайте перепишем наш пример, чтобы использовать Optional<Character> для обработки возможности null значения для объекта Character.

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

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

    import java.util.Optional;
    
    public class HelloJava {
        public static void main(String[] args) {
            Character myChar = null; // По-прежнему может быть null
    
            // Создаем объект Optional из потенциально null объекта Character
            Optional<Character> optionalChar = Optional.ofNullable(myChar);
    
            // Используем методы Optional для проверки и обработки значения
            if (optionalChar.isPresent() && Character.isLetter(optionalChar.get())) {
                 System.out.println("myChar is a letter.");
            } else {
                 System.out.println("myChar is not a letter or is null.");
            }
    
            // Другой способ с использованием функциональных методов Optional (более продвинутый)
            // optionalChar.filter(Character::isLetter)
            //             .ifPresentOrElse(
            //                 c -> System.out.println("myChar is a letter (using Optional methods)."),
            //                 () -> System.out.println("myChar is not a letter or is null (using Optional methods).")
            //             );
        }
    }

    В этом коде:

    • Мы импортируем класс Optional.
    • По-прежнему объявляем myChar как потенциально null.
    • Optional<Character> optionalChar = Optional.ofNullable(myChar); создает объект Optional. Метод Optional.ofNullable() используется, когда значение может быть null. Если myChar равно null, optionalChar будет пустым объектом Optional. Если myChar имеет значение, optionalChar будет содержать это значение.
    • Затем мы используем метод optionalChar.isPresent() для проверки, содержит ли объект Optional значение, прежде чем пытаться получить его с помощью optionalChar.get() и передать в метод Character.isLetter(). Это похоже на нашу предыдущую проверку на null, но использует API класса Optional.
    • Закомментированная часть показывает более продвинутый способ использования Optional с функциональными методами, такими как filter и ifPresentOrElse, которые могут сделать код более компактным в определенных сценариях. В этом вводном уроке мы не будем фокусироваться на этом продвинутом использовании, но полезно знать о нем.
  3. Сохраните файл.

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

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

    java HelloJava

    Вывод должен быть таким же, как на предыдущем этапе:

    myChar is not a letter or is null.

    Это подтверждает, что использование Optional.ofNullable() и isPresent() корректно обрабатывает случай null.

Теперь изменим myChar на не-null символ, чтобы посмотреть, как ведет себя программа.

  1. Измените файл HelloJava.java, установив myChar равным символу, например, 'A':

    import java.util.Optional;
    
    public class HelloJava {
        public static void main(String[] args) {
            Character myChar = 'A'; // Теперь myChar имеет значение
    
            // Создаем объект Optional из потенциально null объекта Character
            Optional<Character> optionalChar = Optional.ofNullable(myChar);
    
            // Используем методы Optional для проверки и обработки значения
            if (optionalChar.isPresent() && Character.isLetter(optionalChar.get())) {
                 System.out.println("myChar is a letter.");
            } else {
                 System.out.println("myChar is not a letter or is null.");
            }
        }
    }
  2. Сохраните файл.

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

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

    java HelloJava

    На этот раз вывод должен быть следующим:

    myChar is a letter.

    Это показывает, что когда myChar имеет значение, метод optionalChar.isPresent() возвращает true, и проверка Character.isLetter() выполняется корректно.

Использование Optional может сделать ваш код более читаемым и явно указать, когда значение может отсутствовать, уменьшая вероятность неожиданных ошибок NullPointerException.

Резюме

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