Nulinės rodyklės išimtis Java

NullPointerException programoje Java yra RuntimeException. Tai atsitinka, kai programa bando naudoti objekto nuorodą, kurios reikšmė yra nul. Java „null“ yra speciali reikšmė, kurią galima priskirti objektų nuorodoms, nurodant, kad reikšmės nėra.

Nulinės rodyklės išimties priežastys

NullPointerException atsiranda dėl šių priežasčių: 

  • Metodo iškvietimas iš nulinio objekto.
  • Nulinio objekto lauko prieiga arba modifikavimas.
  • Nulinio ilgio ėmimas taip, lyg tai būtų masyvas.
  • Nulinių objektų lizdų prieiga arba keitimas taip, lyg tai būtų masyvas.
  • Metimas nulinis, tarsi tai būtų Metimo vertė.
  • Kai bandote sinchronizuoti per nulinį objektą.

Pavyzdys:

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

Išvestis:

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

Paaiškinimas: Šiame pavyzdyje eilutės nuoroda „s“ yra nulinė. Kai programa bando iškviesti long() metodą, ji išmeta NullPointerException, nes tikrojo objekto nėra.

Kodėl „Java“ naudojamas null?

Nulinė reikšmė naudojama kaip rezervuota vieta ir nurodo, kad nuorodos kintamajam nėra priskirta jokia reikšmė. Įprastos programos apima:

  • Susietos duomenų struktūros : reiškia sąrašo arba medžio šakos pabaigą.
  • Dizaino modeliai : Tai naudojama tokiuose modeliuose kaip Null Object Pattern arba Singleton Pattern.

Kaip išvengti NullPointerException

Norėdami išvengti NullPointerException, turime užtikrinti, kad visi objektai būtų tinkamai inicijuoti prieš juos naudodami. Kai deklaruojame nuorodos kintamąjį, prieš pateikdami užklausą dėl metodo arba lauko iš objektų, turime patikrinti, ar objektas nėra nulinis.

1. Styginių raidžių naudojimas lygyje ()

Labai dažna atvejo problema apima eilutės kintamojo ir literalo palyginimą. Literatūra gali būti eilutė arba Enum elementas. Užuot iškvietę metodą iš nulinio objekto, apsvarstykite galimybę jį iškviesti iš literalo. 

Pavyzdys:

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

Išvestis
NullPointerException Caught 

Mes galime išvengti NullPointerException iškviesdami lygiavertį žodį, o ne 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'  );      }      }   }   

Išvestis
Not Same 

Pastaba : Visada iškvieskite lygybę literale, kad išvengtumėte metodo iškvietimo ant nulinės nuorodos.

2. Tikrinimo metodo argumentai

Prieš vykdydami naujojo metodo turinį, pirmiausia turėtume patikrinti jo argumentus, ar nėra niekinių reikšmių, ir tęsti metodo vykdymą tik tada, kai argumentai yra tinkamai patikrinti. Priešingu atveju jis išmes IllegalArgumentException ir praneš iškvietimo metodui, kad kažkas negerai su perduodamais argumentais. 

Pavyzdys:

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

Išvestis
0 13 IllegalArgumentException caught  

3. Naudokite „Tternary Operator“.

Trinaris operatorius gali būti naudojamas norint išvengti NullPointerException. Pirmiausia įvertinama Būlio išraiška. Jei išraiška teisinga, grąžinama reikšmė1, priešingu atveju grąžinama reikšmė2. Nulinėms rodyklėms tvarkyti galime naudoti trijų dalių operatorių.

Pavyzdys:

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

Išvestis
Geeks  

Paaiškinimas : trijų dalių operatorius padeda patikrinti, ar nėra nulio, ir išvengti operacijų su nulinėmis nuorodomis.

4. Pasirenkamos klasės naudojimas („Java 8+“)

Java 8 Neprivaloma klasė buvo pristatyta kaip konteinerio objektas, kuriame gali būti arba negali būti nulio reikšmės. Tai padeda išvengti NullPointerException verčiant aiškiai tvarkyti atvejį, kai reikšmės nėra.

Pavyzdys:

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

Išvestis
Default Name  

Paaiškinimas: Optional.ofNullable(value) apvynioja reikšmę, kuri gali būti nulinė. arbaElse() suteikia atsarginį variantą, jei reikšmės nėra.