Виняток нульового покажчика в Java
Виняток NullPointerException у Java є винятком RuntimeException. Це відбувається, коли програма намагається використати посилання на об’єкт із нульовим значенням. У Java «null» — це спеціальне значення, яке можна призначити посиланням на об’єкт, щоб вказати на відсутність значення.
Причини винятку нульового покажчика
Виняток NullPointerException виникає з таких причин:
- Виклик методу з нульового об’єкта.
- Доступ або зміна поля нульового об’єкта.
- Отримання довжини null як масиву.
- Доступ або зміна слотів нульових об’єктів, як якщо б це був масив.
- Викидання null, як якщо б це було значення Throwable.
- Під час спроби синхронізації через нульовий об’єкт.
приклад:
Java public class Geeks { public static void main ( String [] args ) { // Reference set to null String s = null ; System . out . println ( s . length ()); } }
Вихід:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)Пояснення: У цьому прикладі посилання на рядок 's' є нульовим. Коли програма намагається викликати метод length(), вона створює виключення NullPointerException, оскільки фактичного об’єкта немає.
Чому в Java використовується значення null?
Нульове значення служить заповнювачем і вказує на те, що жодне значення не присвоєно посилальній змінній. Загальні програми включають:
- Зв'язані структури даних : представляє кінець списку або гілки дерева.
- Шаблони проектування : використовується в таких шаблонах, як шаблон нульового об’єкта або шаблон одного елемента.
Як уникнути виключення NullPointerException
Щоб уникнути NullPointerException, ми повинні переконатися, що всі об’єкти правильно ініціалізовані, перш ніж використовувати їх. Коли ми оголошуємо посилальну змінну, ми повинні перевірити, що об’єкт не є нульовим, перш ніж запитувати метод або поле в об’єктів.
1. Використання рядкових літералів у equals()
Дуже поширеною проблемою є порівняння змінної String із літералом. Літерал може бути рядком або елементом Enum. Замість того, щоб викликати метод з нульового об’єкта, спробуйте викликати його з літералу.
приклад:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // Initializing String variable with null value String s = null ; // Checking if s.equals null try { // This line of code throws NullPointerException because s is null if ( s . equals ( 'gfg' )) System . out . print ( 'Same' ); else System . out . print ( 'Not Same' ); } catch ( NullPointerException e ) { System . out . print ( 'NullPointerException Caught' ); } } }
Вихід
NullPointerException Caught
Ми можемо уникнути NullPointerException, викликавши дорівнює літералу, а не об’єкту.
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // Initializing String variable with null value String s = null ; // Checking if s is null using try catch try { if ( 'gfg' . equals ( s )) System . out . print ( 'Same' ); else System . out . print ( 'Not Same' ); } catch ( NullPointerException e ) { System . out . print ( 'Caught NullPointerException' ); } } }
Вихід
Not Same
Примітка : Завжди викликайте дорівнює для літералу, щоб уникнути виклику методу за нульовим посиланням.
2. Перевірка аргументів методу
Перед виконанням тіла нового методу ми повинні спочатку перевірити його аргументи на наявність нульових значень і продовжити виконання методу лише тоді, коли аргументи перевірені належним чином. Інакше він викине IllegalArgumentException і сповістить метод, що викликає, що щось не так із переданими аргументами.
приклад:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // String s set an empty string and calling getLength() String s = '' ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } // String s set to a value and calling getLength() s = 'GeeksforGeeks' ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } // Setting s as null and calling getLength() s = null ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } } public static int getLength ( String s ) { if ( s == null ) throw new IllegalArgumentException ( 'The argument cannot be null' ); return s . length (); } }
Вихід
0 13 IllegalArgumentException caught
3. Використовуйте тернарний оператор
Тернарний оператор можна використовувати, щоб уникнути NullPointerException. Спочатку обчислюється логічний вираз. Якщо вираз є істинним, тоді повертається значення1, інакше повертається значення2. Ми можемо використовувати тернарний оператор для обробки нульових покажчиків.
приклад:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { String s = null ; String m = ( s == null ) ? '' : s . substring ( 0 5 ); System . out . println ( m ); s = 'Geeksforgeeks' ; m = ( s == null ) ? '' : s . substring ( 0 5 ); System . out . println ( m ); } }
Вихід
Geeks
Пояснення : тернарний оператор допомагає перевірити наявність нуля та уникнути операцій над нульовими посиланнями.
4. Використання додаткового класу (Java 8+)
У Java 8 Optional клас був представлений як об’єкт-контейнер, який може містити або не містити ненульове значення. Це допомагає уникнути NullPointerException примушуючи явно обробляти випадок, коли значення відсутнє.
приклад:
Java import java.util.Optional ; public class OptionalExample { public static void main ( String [] args ) { Optional < String > name = Optional . ofNullable ( null ); // Safe way to access System . out . println ( name . orElse ( 'Default Name' )); // prints: Default Name } }
Вихід
Default Name
Пояснення: Optional.ofNullable(value) обгортає значення, яке може бути нульовим. orElse() забезпечує резервний варіант, якщо значення відсутнє.