Izjema ničelnega kazalca v Javi

NullPointerException v Javi je RuntimeException. Do tega pride, ko program poskuša uporabiti referenco objekta, ki ima ničelno vrednost. V Javi je 'null' posebna vrednost, ki jo je mogoče dodeliti sklicem na objekte, da označijo odsotnost vrednosti.

Razlogi za izjemo ničelnega kazalca

Do izjeme NullPointerException pride zaradi naslednjih razlogov: 

  • Priklic metode iz ničelnega objekta.
  • Dostopanje ali spreminjanje polja ničelnega predmeta.
  • Vzemite dolžino null, kot da bi bila matrika.
  • Dostopanje ali spreminjanje rež ničelnih objektov, kot da bi šlo za polje.
  • Vrženje ničelne vrednosti, kot da bi bila vrednost, ki jo je mogoče vrniti.
  • Ko poskušate sinhronizirati prek ničelnega objekta.

primer:

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

Izhod:

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

Pojasnilo: V tem primeru je referenca niza 's' ničelna. Ko program poskuša poklicati metodo length(), vrže izjemo NullPointerException, ker dejanskega predmeta ni.

Zakaj se v Javi uporablja null?

Ničelna vrednost služi kot ograda in označuje, da referenčni spremenljivki ni dodeljena nobena vrednost. Pogoste aplikacije vključujejo:

  • Povezane podatkovne strukture : Predstavlja konec seznama ali veje drevesa.
  • Oblikovalski vzorci : To se uporablja v vzorcih, kot sta vzorec ničelnega predmeta ali vzorec posameznega predmeta.

Kako se izogniti izjemi NullPointerException

Da bi se izognili izjemi NullPointerException, moramo zagotoviti, da so vsi objekti pravilno inicializirani, preden jih uporabimo. Ko deklariramo referenčno spremenljivko, moramo preveriti, da objekt ni ničelna vrednost, preden od objektov zahtevamo metodo ali polje.

1. Uporaba nizovnih literalov v equals()

Zelo pogosta težava s primeri vključuje primerjavo med spremenljivko String in literalom. Literal je lahko niz ali element enuma. Namesto da bi metodo priklicali iz ničelnega objekta, jo razmislite o priklicu iz literala. 

primer:

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

Izhod
NullPointerException Caught 

Izjemi NullPointerException se lahko izognemo tako, da kličemo equals za literal namesto za 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'  );      }      }   }   

Izhod
Not Same 

Opomba : vedno prikličite enako na literal, da se izognete klicu metode na ničelnem sklicu.

2. Preverjanje argumentov metode

Preden izvedemo telo nove metode, najprej preverimo njene argumente za ničelne vrednosti in nadaljujemo z izvajanjem metode šele, ko so argumenti pravilno preverjeni. V nasprotnem primeru bo vrgel IllegalArgumentException in obvestil klicno metodo, da je s posredovanimi argumenti nekaj narobe. 

primer:

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

Izhod
0 13 IllegalArgumentException caught  

3. Uporabite ternarni operater

S ternarnim operatorjem se lahko izognete NullPointerException. Najprej se ovrednoti logični izraz. Če je izraz resničen, je vrnjena vrednost1, drugače je vrnjena vrednost2. Za obdelavo ničelnih kazalcev lahko uporabimo ternarni operator.

primer:

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

Izhod
Geeks  

Razlaga : Ternarni operater pomaga preveriti ničelne vrednosti in se izogniti operacijam na ničelnih referencah.

4. Uporaba neobveznega razreda (Java 8+)

V Javi 8 Izbirni razred je bil uveden kot vsebniški objekt, ki lahko vsebuje ali pa tudi ne ničelno vrednost. Pomaga pri izogibanju NullPointerException tako, da prisili, da eksplicitno obravnava primer, ko vrednost ni.

primer:

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

Izhod
Default Name  

Pojasnilo: Optional.ofNullable(value) ovije vrednost, ki je lahko ničelna. orElse() nudi nadomestno možnost, če vrednost ni prisotna.