Изузетак Нулл Поинтер у Јави

НуллПоинтерЕкцептион у Јави је РунтимеЕкцептион. Јавља се када програм покуша да користи референцу објекта која има нулту вредност. У Јави 'нулл' је посебна вредност која се може доделити референцама на објекте како би се указало на одсуство вредности.

Разлози за изузетак Нулл Поинтер

НуллПоинтерЕкцептион се јавља из следећих разлога: 

  • Позивање методе из нултог објекта.
  • Приступ или измена поља нултог објекта.
  • Узимање дужине нуле као да је низ.
  • Приступ или модификовање утора нултих објеката као да је низ.
  • Бацање нуле као да је вредност која се може бацати.
  • Када покушате да извршите синхронизацију преко нултог објекта.

Пример:

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)

Објашњење: У овом примеру референца на стринг 'с' је нула. Када програм покуша да позове методу ленгтх(), он избацује НуллПоинтерЕкцептион јер не постоји стварни објекат.

Зашто се нулл користи у Јави?

Нулл вредност служи као чувар места и означава да референтној променљивој није додељена ниједна вредност. Уобичајене апликације укључују:

  • Повезане структуре података : Представља крај листе или гране стабла.
  • Десигн Паттернс : Ово се користи у обрасцима као што су Нулл Објецт Паттерн или Синглетон Паттерн.

Како избећи НуллПоинтерЕкцептион

Да бисмо избегли НуллПоинтерЕкцептион, морамо да обезбедимо да су сви објекти правилно иницијализовани пре него што их употребимо. Када декларишемо референтну променљиву, морамо да проверимо да објекат није нулл пре него што затражимо метод или поље од објеката.

1. Коришћење стринг литерала у екуалс()

Веома чест проблем случаја укључује поређење између стринг променљиве и литерала. Литерал може бити стринг или елемент енума. Уместо позивања методе из нултог објекта, размислите о томе да га позовете из литерала. 

Пример:

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 

НуллПоинтерЕкцептион можемо избећи позивањем једнаких на литерал, а не на објекат.

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. Провера аргумената методе

Пре извршавања тела нове методе прво треба да проверимо њене аргументе за нулте вредности и да наставимо са извршавањем методе само када су аргументи исправно проверени. У супротном ће бацити изузетак ИллегалАргументЕкцептион и обавестити метод који позива да нешто није у реду са прослеђеним аргументима. 

Пример:

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. Користите тернарни оператор

Тернарни оператор се може користити за избегавање НуллПоинтерЕкцептион. Прво се процењује Булов израз. Ако је израз тачан онда се враћа вредност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. Коришћење опционе класе (Јава 8+)

У Јави 8 Опциона класа је уведена као контејнерски објекат који може, али и не мора да садржи вредност која није нулта. Помаже у избегавању НуллПоинтерЕкцептион присиљавањем да се експлицитно рукује случајем када је вредност одсутна.

Пример:

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  

Објашњење: Опционално.офНуллабле(валуе) обавија вредност која може бити нулл. орЕлсе() обезбеђује резервни део ако вредност није присутна.