Null pointer kivétel Java nyelven

A Java NullPointerException egy RuntimeException. Akkor fordul elő, amikor egy program null értékű objektumhivatkozást próbál meg használni. Java-ban a „null” egy speciális érték, amely az objektumhivatkozásokhoz rendelhető, jelezve az érték hiányát.

A nullamutató kivételének okai

A NullPointerException a következő okok miatt fordul elő: 

  • Metódus meghívása null objektumból.
  • Nulla objektum mezőjének elérése vagy módosítása.
  • A null hosszát úgy véve, mintha egy tömb lenne.
  • A nullobjektumok helyeinek elérése vagy módosítása úgy, mintha az egy tömb lenne.
  • A nullát dobja, mintha dobható érték lenne.
  • Amikor null objektumon keresztül próbál szinkronizálni.

Példa:

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

Kimenet:

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

Magyarázat: Ebben a példában az „s” karakterlánc-hivatkozás nulla. Amikor a program megpróbálja meghívni a length() metódust, akkor egy NullPointerException kivételt dob, mert nincs tényleges objektum.

Miért a null használatos a Java-ban?

A null érték helyőrzőként szolgál, és azt jelzi, hogy nincs érték hozzárendelve egy referenciaváltozóhoz. A gyakori alkalmazások a következők:

  • Kapcsolt adatszerkezetek : Lista vagy faág végét jelöli.
  • Tervezési minták : Ez olyan mintákban használatos, mint a Null Object Pattern vagy Singleton Pattern.

Hogyan lehet elkerülni a NullPointerException-t

A NullPointerException elkerülése érdekében meg kell győződnünk arról, hogy minden objektum megfelelően inicializálva van, mielőtt használnánk őket. Amikor deklarálunk egy referenciaváltozót, meg kell győződnünk arról, hogy az objektum nem nulla, mielőtt metódust vagy mezőt kérnénk az objektumoktól.

1. String Literálok használata egyenlőségben()

Egy nagyon gyakori esetprobléma a String változó és a literál összehasonlítása. A literál lehet egy karakterlánc vagy egy enum elem. Ahelyett, hogy a null objektumból hívná meg a metódust, fontolja meg a literálból való meghívását. 

Példa:

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

Kimenet
NullPointerException Caught 

A NullPointerException kivételét elkerülhetjük, ha az egyenlőt literálra hívjuk, nem pedig objektumra.

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

Kimenet
Not Same 

Jegyzet : Mindig hívja meg az egyenlő értéket a literálban, hogy elkerülje a metódus hívását nulla hivatkozáson.

2. A módszer argumentumainak ellenőrzése

Az új metódus törzsének végrehajtása előtt először ellenőriznünk kell az argumentumokat null értékekre, és csak akkor kell folytatni a metódus végrehajtását, ha az argumentumokat megfelelően ellenőriztük. Ellenkező esetben IllegalArgumentException kivételt dob, és értesíti a hívó metódust, hogy valami nincs rendben az átadott argumentumokkal. 

Példa:

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

Kimenet
0 13 IllegalArgumentException caught  

3. Használja a Ternary Operatort

A háromtagú operátor használható a NullPointerException elkerülésére. Először a Boole-féle kifejezés kerül kiértékelésre. Ha a kifejezés igaz, akkor az érték1 kerül visszaadásra, ellenkező esetben az érték2. Használhatjuk a háromtagú operátort a null mutatók kezelésére.

Példa:

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

Kimenet
Geeks  

Magyarázat : A háromtagú operátor segít a null-ellenőrzésben és a nulla hivatkozásokon végzett műveletek elkerülésében.

4. Opcionális osztály használata (Java 8+)

A Java 8-ban az opcionális osztályt olyan konténerobjektumként vezették be, amely tartalmazhat nem null értéket, vagy nem. Segít elkerülni NullPointerException azáltal, hogy arra kényszeríti, hogy kifejezetten kezelje azt az esetet, amikor egy érték hiányzik.

Példa:

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

Kimenet
Default Name  

Magyarázat: Az Optional.ofNullable(value) becsomagolja az értéket, amely lehet null. Az orElse() tartalékot biztosít, ha az érték nincs jelen.