Výnimka nulového ukazovateľa v jazyku Java

Výnimka NullPointerException v jazyku Java je výnimka RuntimeException. Vyskytuje sa, keď sa program pokúsi použiť odkaz na objekt, ktorý má hodnotu null. V jazyku Java je 'null' špeciálna hodnota, ktorá môže byť priradená k objektovým referenciám na označenie absencie hodnoty.

Dôvody výnimky nulového ukazovateľa

Výnimka NullPointerException sa vyskytuje z nasledujúcich dôvodov: 

  • Vyvolanie metódy z nulového objektu.
  • Prístup alebo úprava poľa nulového objektu.
  • Ak vezmeme dĺžku null, ako keby to bolo pole.
  • Prístup alebo úprava slotov nulových objektov, ako keby to bolo pole.
  • Hádzanie null, ako keby to bola hodnota Throwable.
  • Pri pokuse o synchronizáciu cez nulový objekt.

Príklad:

Java
   public     class   Geeks     {          public     static     void     main  (  String  []     args  )     {          // Reference set to null      String     s     =     null  ;             System  .  out  .  println  (  s  .  length  ());         }   }   

výstup:

 Hangup (SIGHUP)   
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)

Vysvetlenie: V tomto príklade je odkaz na reťazec „s“ null. Keď sa program pokúsi zavolať metódu length(), vyvolá výnimku NullPointerException, pretože neexistuje žiadny skutočný objekt.

Prečo sa v jazyku Java používa null?

Nulová hodnota slúži ako zástupný symbol a označuje, že referenčnej premennej nie je priradená žiadna hodnota. Bežné aplikácie zahŕňajú:

  • Prepojené dátové štruktúry : Predstavuje koniec zoznamu alebo vetvy stromu.
  • Dizajnové vzory : Používa sa vo vzoroch, ako je vzor nulového objektu alebo vzor Singleton.

Ako sa vyhnúť výnimke NullPointerException

Aby sme sa vyhli výnimke NullPointerException, musíme zabezpečiť, aby boli všetky objekty pred použitím správne inicializované. Keď deklarujeme referenčnú premennú, musíme overiť, či objekt nie je nulový, skôr než od objektov požiadame o metódu alebo pole.

1. Použitie reťazcových literálov v equals()

Veľmi častý problém s prípadmi zahŕňa porovnanie medzi premennou typu String a literálom. Literál môže byť reťazec alebo prvok Enum. Namiesto vyvolania metódy z nulového objektu zvážte jej vyvolanie z literálu. 

Príklad:

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'  );      }      }   }   

Výstup
NullPointerException Caught 

Výnimke NullPointerException sa môžeme vyhnúť volaním rovná sa skôr na doslov než na objekt.

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'  );      }      }   }   

Výstup
Not Same 

Poznámka : Vždy vyvolávajte rovná sa na literáli, aby ste sa vyhli volaniu metódy na nulovom odkaze.

2. Kontrola argumentov metódy

Pred spustením tela novej metódy by sme mali najprv skontrolovať jej argumenty na nulové hodnoty a pokračovať vo vykonávaní metódy až vtedy, keď sú argumenty správne skontrolované. V opačnom prípade vyvolá výnimku IllegalArgumentException a upozorní volajúcu metódu, že niečo nie je v poriadku s odovzdanými argumentmi. 

Príklad:

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  ();      }   }   

Výstup
0 13 IllegalArgumentException caught  

3. Použite ternárny operátor

Na vyhnutie sa výnimke NullPointerException možno použiť ternárny operátor. Najprv sa vyhodnotí boolovský výraz. Ak je výraz pravdivý, vráti sa hodnota1, inak sa vráti hodnota2. Na manipuláciu s nulovými ukazovateľmi môžeme použiť ternárny operátor.

Príklad:

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  );      }   }   

Výstup
Geeks  

Vysvetlenie : Ternárny operátor pomáha kontrolovať nulové hodnoty a vyhýbať sa operáciám s nulovými referenciami.

4. Používanie voliteľnej triedy (Java 8+)

V jazyku Java 8 bola voliteľná trieda zavedená ako kontajnerový objekt, ktorý môže alebo nemusí obsahovať nenulovú hodnotu. Pomáha vyhnúť sa Výnimka NullPointerException prinútením explicitne riešiť prípad, keď hodnota chýba.

Príklad:

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      }   }   

Výstup
Default Name  

Vysvetlenie: Optional.ofNullable(value) zabalí hodnotu, ktorá môže byť null. orElse() poskytuje núdzové riešenie, ak hodnota nie je prítomná.