Iznimka nultog pokazivača u Javi

NullPointerException u Javi je RuntimeException. To se događa kada program pokuša upotrijebiti referencu objekta koja ima vrijednost null. U Javi 'null' je posebna vrijednost koja se može dodijeliti referencama na objekte kako bi se označilo nepostojanje vrijednosti.

Razlozi za iznimku nultog pokazivača

NullPointerException javlja se zbog sljedećih razloga: 

  • Pozivanje metode iz nultog objekta.
  • Pristup ili izmjena polja nultog objekta.
  • Uzimanje duljine od null kao da je niz.
  • Pristup ili izmjena utora nultih objekata kao da je niz.
  • Izbacivanje nule kao da je vrijednost koja se može izbaciti.
  • Kada pokušate sinkronizirati preko null objekta.

Primjer:

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

Izlaz:

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

Obrazloženje: U ovom primjeru referenca niza 's' je nula. Kada program pokuša pozvati metodu length(), izbacuje NullPointerException jer nema stvarnog objekta.

Zašto se null koristi u Javi?

Nulta vrijednost služi kao rezervirano mjesto i označava da nijedna vrijednost nije dodijeljena referentnoj varijabli. Uobičajene primjene uključuju:

  • Povezane strukture podataka : Predstavlja kraj liste ili grane stabla.
  • Dizajn uzorci : Ovo se koristi u obrascima kao što su Null Object Pattern ili Singleton Pattern.

Kako izbjeći NullPointerException

Kako bismo izbjegli NullPointerException, moramo osigurati da su svi objekti ispravno inicijalizirani prije nego što ih upotrijebimo. Kada deklariramo referentnu varijablu, moramo provjeriti da objekt nije null prije nego što od objekata zatražimo metodu ili polje.

1. Korištenje string literala u equals()

Vrlo čest problem slučaja uključuje usporedbu između String varijable i literala. Literal može biti String ili element Enuma. Umjesto pozivanja metode iz null objekta razmislite o pozivanju metode iz literala. 

Primjer:

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

Izlaz
NullPointerException Caught 

NullPointerException možemo izbjeći pozivanjem jednakosti na literalu umjesto na objektu.

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

Izlaz
Not Same 

Bilješka : Uvijek pozovite equals na literalu kako biste izbjegli pozivanje metode na nultoj referenci.

2. Provjera argumenata metode

Prije izvršavanja tijela nove metode prvo trebamo provjeriti njene argumente za null vrijednosti i nastaviti s izvršavanjem metode tek kada su argumenti pravilno provjereni. Inače će izbaciti IllegalArgumentException i obavijestiti pozivajuću metodu da nešto nije u redu s proslijeđenim argumentima. 

Primjer:

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

Izlaz
0 13 IllegalArgumentException caught  

3. Koristite ternarni operator

Ternarni operator može se koristiti za izbjegavanje NullPointerException. Prvo se procjenjuje Boolean izraz. Ako je izraz istinit, vraća se vrijednost1, inače se vraća vrijednost2. Možemo koristiti ternarni operator za rukovanje nultim pokazivačima.

Primjer:

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

Izlaz
Geeks  

Obrazloženje : Ternarni operator pomaže u provjeri null i izbjegavanju operacija na null referencama.

4. Korištenje izborne klase (Java 8+)

U Javi 8 Optional klasa uvedena je kao objekt spremnika koji može ali ne mora sadržavati vrijednost koja nije null. Pomaže u izbjegavanju NullPointerException prisiljavanjem da eksplicitno obradi slučaj kada je vrijednost odsutna.

Primjer:

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

Izlaz
Default Name  

Obrazloženje: Optional.ofNullable(value) omotava vrijednost koja bi mogla biti null. orElse() pruža zamjenu ako vrijednost nije prisutna.