Виняток нульового покажчика в 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() забезпечує резервний варіант, якщо значення відсутнє.