Введение
В этом практическом занятии (лабораторной работе) вы научитесь проверять, является ли логическая (булева) переменная равной true в Java. Мы рассмотрим основной метод с использованием оператора равенства, углубимся в обработку оберточного класса Boolean и обсудим, как управлять потенциальными нулевыми значениями.
С помощью практических примеров вы получите практический опыт в написании условной логики на основе булевых значений, обеспечивая надежность вашего Java-кода и эффективную обработку различных сценариев.
Использование оператора равенства для проверки на истинность
На этом этапе мы рассмотрим, как проверить, является ли булева переменная равной true в Java, используя оператор равенства. Хотя это может показаться простым, понимание нюансов важно для написания чистого и корректного кода.
В Java тип данных boolean может принимать одно из двух значений: true или false. Когда у вас есть булева переменная, вам часто нужно проверить ее значение, чтобы принимать решения в программе.
Самым распространенным способом проверить, является ли булева переменная равной true, является использование оператора равенства ==.
Создадим простую Java-программу, чтобы продемонстрировать это.
Откройте файл
HelloJava.javaв редакторе WebIDE, если он еще не открыт.Замените все содержимое файла следующим кодом:
public class HelloJava { public static void main(String[] args) { boolean isJavaFun = true; if (isJavaFun == true) { System.out.println("Java is fun!"); } else { System.out.println("Java is not fun."); } } }Рассмотрим новые части этого кода:
boolean isJavaFun = true;: Эта строка объявляет булеву переменную с именемisJavaFunи инициализирует ее значениемtrue.if (isJavaFun == true): Это операторif. Он проверяет, является ли условие в скобках равнымtrue. УсловиеisJavaFun == trueиспользует оператор равенства==для сравнения значения переменнойisJavaFunс булевым литераломtrue.System.out.println("Java is fun!");: Эта строка будет выполнена, если условиеisJavaFun == trueравноtrue.else: Это ключевое слово представляет блок кода, который будет выполнен, если условие оператораifравноfalse.System.out.println("Java is not fun.");: Эта строка будет выполнена, если условиеisJavaFun == trueравноfalse.
Сохраните файл (Ctrl+S или Cmd+S).
Скомпилируйте программу с помощью команды
javacв терминале:javac HelloJava.javaЕсли нет ошибок, в директории
~/projectбудет создан файлHelloJava.class.Запустите скомпилированную программу с помощью команды
java:java HelloJavaВы должны увидеть следующий вывод:
Java is fun!Это подтверждает, что условие оператора
ifisJavaFun == trueбыло оценено какtrue, и соответствующее сообщение было выведено.
Хотя использование == true является абсолютно допустимым и легко понятным, в Java вы можете упростить проверку на true. Поскольку оператор if уже оценивает выражение в скобках как булево значение, вы можете напрямую использовать саму булеву переменную в качестве условия.
Изменим код, чтобы использовать этот упрощенный подход:
Откройте файл
HelloJava.javaснова в редакторе.Измените оператор
ifна следующий:if (isJavaFun) { System.out.println("Java is fun!"); } else { System.out.println("Java is not fun."); }Обратите внимание, что мы удалили
== true. Операторif (isJavaFun)эквивалентенif (isJavaFun == true).Сохраните файл.
Скомпилируйте модифицированную программу:
javac HelloJava.javaЗапустите программу снова:
java HelloJavaВы получите тот же вывод:
Java is fun!Это показывает, что использование булевой переменной напрямую в условии оператора
ifявляется более кратким и идиоматичным способом проверить, является ли она равнойtrue.
В целом, вы можете использовать оператор равенства == true для проверки, является ли булево значение равным true, но более распространенным и чистым способом является просто использование самой булевой переменной в качестве условия в операторе if.
Тестирование с использованием обёрточного класса Boolean
На предыдущем этапе мы работали с примитивным типом boolean. В Java также есть соответствующий оберточный класс, называемый Boolean. Оборточные классы позволяют использовать примитивные типы данных как объекты. Это особенно полезно при работе с коллекциями или когда вам нужно представить булевое значение, которое может быть равно null.
Класс Boolean имеет два предопределенных объекта для булевых значений: Boolean.TRUE и Boolean.FALSE. Это константные объекты, представляющие булевы значения true и false соответственно.
При работе с объектами Boolean вы по-прежнему можете использовать оператор равенства == для их сравнения. Однако важно понимать, как работает == с объектами. Для объектов == проверяет, ссылаются ли две переменные на один и тот же объект в памяти, а не просто имеют ли они одинаковые значения.
Изменим нашу программу, чтобы использовать оберточный класс Boolean и посмотреть, как ведет себя оператор равенства.
Откройте файл
HelloJava.javaв редакторе WebIDE.Замените код следующим:
public class HelloJava { public static void main(String[] args) { Boolean isJavaFunObject = Boolean.TRUE; if (isJavaFunObject == Boolean.TRUE) { System.out.println("Java is fun (using Boolean.TRUE)!"); } else { System.out.println("Java is not fun (using Boolean.TRUE)."); } Boolean anotherBooleanObject = true; // Autoboxing if (anotherBooleanObject == Boolean.TRUE) { System.out.println("Another boolean object is true!"); } else { System.out.println("Another boolean object is not true."); } } }Рассмотрим изменения:
Boolean isJavaFunObject = Boolean.TRUE;: Мы объявляем переменную типаBooleanи присваиваем ей константуBoolean.TRUE.if (isJavaFunObject == Boolean.TRUE): Мы используем оператор равенства==для сравнения нашего объектаBooleanс константойBoolean.TRUE. ПосколькуisJavaFunObjectприсвоено значениеBoolean.TRUE, они ссылаются на один и тот же объект, поэтому это условие будет равноtrue.Boolean anotherBooleanObject = true;: Эта строка демонстрирует "автоупаковку" (autoboxing). Java автоматически преобразует примитивное значениеbooleantrueв объектBoolean.if (anotherBooleanObject == Boolean.TRUE): Мы снова используем==для сравненияanotherBooleanObjectсBoolean.TRUE. Из-за того, как работает автоупаковка и кэширование значенийBooleanв Java, для значенийtrueиfalseавтоупакованные объектыBooleanчасто ссылаются на те же кэшированные экземпляры, что иBoolean.TRUEиBoolean.FALSE. Поэтому это условие также, скорее всего, будет равноtrue.
Сохраните файл.
Скомпилируйте программу:
javac HelloJava.javaЗапустите программу:
java HelloJavaВы должны увидеть следующий вывод:
Java is fun (using Boolean.TRUE)! Another boolean object is true!Это подтверждает, что использование
==сBoolean.TRUEработает как ожидается в этих случаях, потому что переменные, скорее всего, ссылаются на один и тот же базовый объектBoolean.TRUE.
Однако полагаться на == для сравнения объектов Boolean может быть рискованным в более сложных сценариях, особенно если объекты Boolean создаются различными способами или приходят из разных источников. Более безопасным и рекомендуемым способом сравнения объектов Boolean на равенство значений является использование метода .equals().
Изменим код, чтобы использовать .equals().
Откройте файл
HelloJava.javaв редакторе.Измените операторы
if, чтобы использовать.equals():public class HelloJava { public static void main(String[] args) { Boolean isJavaFunObject = Boolean.TRUE; if (isJavaFunObject.equals(Boolean.TRUE)) { System.out.println("Java is fun (using equals)!"); } else { System.out.println("Java is not fun (using equals)."); } Boolean anotherBooleanObject = true; // Autoboxing if (anotherBooleanObject.equals(Boolean.TRUE)) { System.out.println("Another boolean object is true (using equals)!"); } else { System.out.println("Another boolean object is not true (using equals)."); } } }Мы заменили
== Boolean.TRUEна.equals(Boolean.TRUE). Метод.equals()сравнивает значения объектов, а не их местоположение в памяти.Сохраните файл.
Скомпилируйте программу:
javac HelloJava.javaЗапустите программу:
java HelloJavaВы должны увидеть следующий вывод:
Java is fun (using equals)! Another boolean object is true (using equals)!Использование
.equals()является стандартным и наиболее безопасным способом сравнения объектовBooleanна равенство значений.
В целом, хотя == может работать для сравнения объектов Boolean с Boolean.TRUE из-за кэширования, метод .equals() является предпочтительным и более надежным способом проверки, представляет ли объект Boolean значение true.
Обработка нулевых значений Boolean
На предыдущем этапе мы узнали о оберточном классе Boolean. Одно из ключевых отличий между примитивным типом boolean и оберточным классом Boolean заключается в том, что переменная типа Boolean может иметь значение null, в то время как примитивный boolean этого сделать не может. Обработка значений null является важной частью программирования на Java, чтобы избежать ошибок NullPointerException.
Ошибка NullPointerException возникает, когда вы пытаетесь использовать переменную, которая в данный момент ссылается на null, как если бы это был действительный объект. Например, вызов метода для объекта, равного null, приведет к ошибке NullPointerException.
При проверке, является ли объект Boolean равным true, необходимо быть осторожным, если объект может быть null.
Давайте посмотрим, что произойдет, если мы попытаемся проверить null объект Boolean с использованием методов, которые мы узнали до сих пор.
Откройте файл
HelloJava.javaв редакторе WebIDE.Замените код следующим:
public class HelloJava { public static void main(String[] args) { Boolean nullableBoolean = null; // Attempting to use == with null if (nullableBoolean == true) { System.out.println("This won't be printed."); } else { System.out.println("Using == with null Boolean."); } // Attempting to use .equals() with null // This will cause a NullPointerException! // if (nullableBoolean.equals(Boolean.TRUE)) { // System.out.println("This will not be reached."); // } else { // System.out.println("This will not be reached either."); // } } }В этом коде:
Boolean nullableBoolean = null;: Мы объявляем переменную типаBooleanи явно устанавливаем ее значение вnull.if (nullableBoolean == true): Мы используем оператор равенства==для сравненияnullобъектаBooleanс примитивным значениемtrue. При сравнении объектаBoolean(даже если он равенnull) с примитивнымboolean, Java выполняет "распаковку" (unboxing). Она пытается преобразовать объектBooleanв примитивныйboolean. Если объектBooleanравенnull, этот процесс распаковки приводит к ошибкеNullPointerException.- Закомментированная проверка с использованием
.equals()также вызовет ошибкуNullPointerException, потому что вы пытаетесь вызвать метод.equals()для объекта, равногоnull(nullableBoolean).
Сохраните файл.
Скомпилируйте программу:
javac HelloJava.javaЗапустите программу:
java HelloJavaВ терминале вы увидите сообщение об ошибке, указывающее на
NullPointerException:Exception in thread "main" java.lang.NullPointerException at HelloJava.main(HelloJava.java:6)Это показывает, что прямое сравнение потенциально
nullобъектаBooleanс примитивнымbooleanс использованием==или вызов.equals()для него может привести к ошибкеNullPointerException.
Для безопасной обработки потенциально null объектов Boolean вы всегда должны проверять, является ли объект null перед попыткой распаковать его или вызвать методы для него.
Вот как вы можете безопасно проверить, является ли объект Boolean равным true:
Откройте файл
HelloJava.javaв редакторе.Замените код следующим:
public class HelloJava { public static void main(String[] args) { Boolean nullableBoolean = null; Boolean trueBoolean = Boolean.TRUE; Boolean falseBoolean = Boolean.FALSE; // Safely check if nullableBoolean is true if (nullableBoolean != null && nullableBoolean == true) { System.out.println("nullableBoolean is true (safe check)."); } else { System.out.println("nullableBoolean is not true or is null (safe check)."); } // Safely check if trueBoolean is true if (trueBoolean != null && trueBoolean == true) { System.out.println("trueBoolean is true (safe check)."); } else { System.out.println("trueBoolean is not true or is null (safe check)."); } // Safely check if falseBoolean is true if (falseBoolean != null && falseBoolean == true) { System.out.println("falseBoolean is true (safe check)."); } else { System.out.println("falseBoolean is not true or is null (safe check)."); } // Alternative safe check using equals if (Boolean.TRUE.equals(nullableBoolean)) { System.out.println("nullableBoolean is true (safe equals check)."); } else { System.out.println("nullableBoolean is not true or is null (safe equals check)."); } if (Boolean.TRUE.equals(trueBoolean)) { System.out.println("trueBoolean is true (safe equals check)."); } else { System.out.println("trueBoolean is not true or is null (safe equals check)."); } } }В этом обновленном коде:
if (nullableBoolean != null && nullableBoolean == true): Мы сначала проверяем, не является лиnullableBooleanравнымnullс использованиемnullableBoolean != null. Оператор&&означает, что вторая часть условия (nullableBoolean == true) будет оценена только в том случае, если первая часть (nullableBoolean != null) равнаtrue. Это предотвращает ошибкуNullPointerException. ЕслиnullableBooleanравенnull, первая часть условия равнаfalse, и все условие равноfalseбез оценки второй части.if (Boolean.TRUE.equals(nullableBoolean)): Это еще один безопасный способ проверить, является ли объектBooleanравнымtrue, даже если он равенnull. Вызывая метод.equals()для известного не-nullобъектаBoolean.TRUEи передавая в качестве аргумента потенциальноnullобъектnullableBoolean, мы избавляемся от ошибкиNullPointerException. Метод.equals()разработан так, чтобы корректно обрабатывать аргументы, равныеnull;Boolean.TRUE.equals(null)просто вернетfalse.
Сохраните файл.
Скомпилируйте программу:
javac HelloJava.javaЗапустите программу:
java HelloJavaВы должны увидеть следующий вывод:
nullableBoolean is not true or is null (safe check). trueBoolean is true (safe check). falseBoolean is not true or is null (safe check). nullableBoolean is not true or is null (safe equals check). trueBoolean is true (safe equals check).Это демонстрирует, как безопасно проверить значение объекта
Boolean, даже если оно может бытьnull, используя как проверку!= nullв сочетании с== true, так и методBoolean.TRUE.equals().
Всегда помните о возможности наличия null при работе с объектами Boolean, чтобы избежать ошибок во время выполнения программы.
Резюме
В этом практическом занятии мы научились проверять, является ли булевая переменная равной true в Java. Мы начали с использования оператора равенства == для прямого сравнения булевой переменной с булевым литералом true. Это самый распространенный и простой способ проверки значения примитивного булевого типа.
Мы также изучили, как работать с оберточными объектами Boolean, которые могут быть равны null. Мы узнали, что прямое сравнение объекта Boolean с true с использованием == может не работать так, как ожидается из-за идентичности объектов. Вместо этого мы должны использовать метод equals() или распаковать объект Boolean в его примитивное булевое значение перед сравнением. Наконец, мы рассмотрели важность обработки потенциальной ошибки NullPointerException при работе с nullable объектами Boolean, проверяя на null перед попыткой получить их значение.



