Введение
В этом практическом занятии (лабораторной работе) вы узнаете, как проверить, инициализирована ли переменная в Java. Мы рассмотрим, как определить null и значения по умолчанию для различных типов данных, что является важным аспектом для предотвращения распространенных ошибок, таких как NullPointerException.
С помощью практических примеров вы научитесь проверять на null и понимать значения по умолчанию, присваиваемые примитивным и ссылочным типам. Вы также узнаете, как обрабатывать неинициализированные поля в классах, чтобы обеспечить надежность и отсутствие ошибок в ваших Java-программах.
Проверка на значения null или значения по умолчанию
На этом этапе мы рассмотрим, как проверить переменные на null или значения по умолчанию в Java. Понимание того, как обрабатывать null, является ключевым аспектом в программировании на Java для предотвращения ошибок, таких как NullPointerException. Также важно знать значения по умолчанию, так как они присваиваются переменным, если они не инициализированы явно.
В Java примитивные типы данных (например, int, boolean, double и др.) имеют значения по умолчанию, в то время как ссылочные типы (например, String, массивы, пользовательские классы) имеют значение по умолчанию null.
Создадим простую Java-программу, которая демонстрирует проверку на null и понимание значений по умолчанию.
Откройте файл
HelloJava.javaв редакторе WebIDE. Если вы завершили предыдущую лабораторную работу, этот файл должен уже существовать в директории~/project.Замените существующий код в файле
HelloJava.javaследующим:public class HelloJava { static int defaultInt; static boolean defaultBoolean; static String defaultString; public static void main(String[] args) { System.out.println("Default int value: " + defaultInt); System.out.println("Default boolean value: " + defaultBoolean); System.out.println("Default String value: " + defaultString); String myString = null; System.out.println("My string value: " + myString); // Example of checking for null if (myString == null) { System.out.println("My string is null."); } else { System.out.println("My string is not null."); } } }Рассмотрим новые части этого кода:
static int defaultInt;: Мы объявляем статическую целочисленную переменнуюdefaultIntбез ее инициализации. Поскольку это статическая переменная примитивного типа, ей будет присвоено значение по умолчанию.static boolean defaultBoolean;: Аналогично, объявляется статическая логическая переменнаяdefaultBoolean, которая получит значение по умолчанию.static String defaultString;: Объявляется статическая переменная типаStringс именемdefaultString. ПосколькуStringявляется ссылочным типом, ее значением по умолчанию будетnull.System.out.println("Default int value: " + defaultInt);: Эта строка выводит значение по умолчанию для целого числа.System.out.println("Default boolean value: " + defaultBoolean);: Эта строка выводит значение по умолчанию для логического типа.System.out.println("Default String value: " + defaultString);: Эта строка выводит значение по умолчанию для строки.String myString = null;: Мы явно объявляем переменную типаStringс именемmyStringи присваиваем ей значениеnull.System.out.println("My string value: " + myString);: Эта строка выводит значение переменнойmyString.if (myString == null): Это условный операторif, который проверяет, равно ли значение переменнойmyStringnull. Это стандартный способ проверки, ссылается ли объект наnull.
Сохраните файл
HelloJava.java(Ctrl+S или Cmd+S).Скомпилируйте программу в терминале:
javac HelloJava.javaЕсли ошибок нет, файл
HelloJava.classбудет обновлен.Запустите скомпилированную программу:
java HelloJavaВы должны увидеть вывод, похожий на следующий:
Default int value: 0 Default boolean value: false Default String value: null My string value: null My string is null.Этот вывод показывает значения по умолчанию для
int(0),boolean(false) иString(null). Он также подтверждает, что наша переменнаяmyStringдействительно равнаnull, и условный операторifправильно определил это.
Понимание null и значений по умолчанию является фундаментальным этапом при написании надежного Java-кода. На следующем этапе мы рассмотрим тестирование с использованием различных типов данных.
Тестирование с разными типами данных
На этом этапе мы расширим наше понимание Java, работая с различными типами данных. В Java есть множество типов данных для хранения разных видов информации, таких как числа, текст и логические значения (истина/ложь).
В Java существуют две основные категории типов данных:
- Примитивные типы данных: Это базовые типы данных, которые хранят простые значения. Примеры включают
int(для целых чисел),double(для чисел с плавающей точкой),boolean(для логических значений истина/ложь),char(для одиночных символов) и т.д. - Ссылочные типы данных: Это типы данных, которые ссылаются на объекты. Примеры включают
String, массивы и классы, которые вы создаете сами.
Давайте изменим нашу программу HelloJava.java, чтобы использовать и отображать различные типы данных.
Откройте файл
HelloJava.javaв редакторе WebIDE.Замените существующий код следующим:
public class HelloJava { public static void main(String[] args) { // Primitive Data Types int age = 30; double price = 19.99; boolean isJavaFun = true; char initial = 'J'; System.out.println("Age: " + age); System.out.println("Price: " + price); System.out.println("Is Java fun? " + isJavaFun); System.out.println("Initial: " + initial); // Reference Data Type (String) String greeting = "Hello, LabEx!"; System.out.println("Greeting: " + greeting); // Reference Data Type (Array) int[] numbers = {1, 2, 3, 4, 5}; System.out.print("Numbers: "); for (int i = 0; i < numbers.length; i++) { System.out.print(numbers[i] + " "); } System.out.println(); // Print a newline at the end } }Рассмотрим новые переменные и код:
int age = 30;: Объявляет целочисленную переменнуюageи присваивает ей значение 30.double price = 19.99;: Объявляет переменную типаdoubleс именемpriceи присваивает ей значение 19.99.boolean isJavaFun = true;: Объявляет логическую переменнуюisJavaFunи присваивает ей значениеtrue.char initial = 'J';: Объявляет символьную переменнуюinitialи присваивает ей символ 'J'. Обратите внимание, что символы обрамляются одинарными кавычками.String greeting = "Hello, LabEx!";: Объявляет переменную типаStringс именемgreetingи присваивает ей текстовое значение. Обратите внимание, что строки обрамляются двойными кавычками.int[] numbers = {1, 2, 3, 4, 5};: Объявляет массив целых чисел с именемnumbersи инициализирует его значениями. Массив - это коллекция элементов одного и того же типа данных.- Цикл
forпроходит по массивуnumbersи выводит каждый элемент.
Сохраните файл
HelloJava.java.Скомпилируйте программу в терминале:
javac HelloJava.javaЗапустите скомпилированную программу:
java HelloJavaВы должны увидеть вывод, похожий на следующий:
Age: 30 Price: 19.99 Is Java fun? true Initial: J Greeting: Hello, LabEx! Numbers: 1 2 3 4 5Этот вывод демонстрирует, как Java обрабатывает и отображает различные примитивные и ссылочные типы данных. Вы можете видеть, что каждая переменная хранит и выводит присвоенное ей значение в соответствии с ее типом.
На этом этапе вы потренировались в объявлении и использовании различных типов данных в Java. Понимание типов данных является фундаментом для хранения и манипуляции информацией в ваших программах. На следующем этапе мы рассмотрим обработку неинициализированных полей.
Обработка неинициализированных полей
На этом этапе мы сосредоточимся на том, как Java обрабатывает поля (переменные внутри класса), которые не были явно инициализированы. Это продолжает наш предыдущий разговор о значениях по умолчанию.
В Java экземплярные переменные (поля, принадлежащие объекту класса) и статические переменные (поля, принадлежащие самому классу) автоматически получают значения по умолчанию, если они не инициализированы при объявлении. Однако локальные переменные (переменные, объявленные внутри метода) не получают значений по умолчанию и должны быть явно инициализированы перед использованием.
Создадим новый класс, чтобы продемонстрировать этот концепт.
В проводнике файлов WebIDE слева щелкните правой кнопкой мыши по директории
~/project, выберите "New File" и введитеFieldExample.java.Откройте файл
FieldExample.javaв редакторе и добавьте следующий код:public class FieldExample { // Instance variables (fields) - automatically get default values int instanceInt; String instanceString; boolean instanceBoolean; // Static variables (fields) - automatically get default values static double staticDouble; static char staticChar; public static void main(String[] args) { // Local variables - must be initialized before use int localInt; // String localString; // If uncommented and used without init, would cause a compile error // Creating an object of FieldExample to access instance variables FieldExample obj = new FieldExample(); System.out.println("Instance int: " + obj.instanceInt); System.out.println("Instance String: " + obj.instanceString); System.out.println("Instance boolean: " + obj.instanceBoolean); System.out.println("Static double: " + staticDouble); System.out.println("Static char: " + staticChar); // Example of using a local variable after initialization localInt = 100; System.out.println("Local int: " + localInt); // The following line would cause a compile-time error if localString was uncommented // System.out.println("Local String: " + localString); } }Рассмотрим этот код:
- Мы объявляем экземплярные переменные (
instanceInt,instanceString,instanceBoolean) и статические переменные (staticDouble,staticChar) без их инициализации. Java автоматически присвоит им значения по умолчанию. - Мы объявляем локальную переменную
localIntвнутри методаmain. - Мы создаем объект
objклассаFieldExampleдля доступа к экземплярным переменным. Статические переменные можно напрямую обращаться по имени класса (staticDouble,staticChar). - Мы выводим значения экземплярных и статических переменных. Вы увидите их значения по умолчанию.
- Мы явно инициализируем локальную переменную
localIntперед ее использованием. - Закомментированная строка
// String localString;и строка ниже показывают, что произойдет, если вы попытаетесь использовать неинициализированную локальную переменную - компилятор Java выдаст ошибку.
- Мы объявляем экземплярные переменные (
Сохраните файл
FieldExample.java.Скомпилируйте программу в терминале:
javac FieldExample.javaЕсли компиляция прошла успешно (без ошибок), будет создан файл
FieldExample.class.Запустите скомпилированную программу:
java FieldExampleВы должны увидеть вывод, похожий на следующий:
Instance int: 0 Instance String: null Instance boolean: false Static double: 0.0 Static char: Local int: 100Этот вывод подтверждает, что экземплярные и статические переменные получают значения по умолчанию (0 для
int,nullдляString,falseдляboolean, 0.0 дляdoubleи нулевой символ дляchar), если не инициализированы. Он также показывает, что локальная переменная должна быть явно инициализирована перед использованием.
Понимание различий в том, как Java обрабатывает неинициализированные экземплярные/статические переменные и локальные переменные, является ключевым моментом для избежания распространенных ошибок в программировании.
Резюме
В этом лабораторном занятии мы научились проверять, инициализирована ли переменная в Java, поняв значения по умолчанию и научившись проверять на null. Мы изучили, как примитивные типы данных получают значения по умолчанию, если они не были явно инициализированы, в то время как объекты по умолчанию равны null. Мы практиковали проверку на null с использованием оператора равенства (==) и продемонстрировали это на простой Java-программе.
Мы также узнали о важности обработки неинициализированных полей, чтобы предотвратить возможные ошибки и обеспечить надежность наших Java-приложений. Понимая значения по умолчанию и проводя правильные проверки на null, мы можем писать более надежный и предсказуемый код.



