Null Pointer Unntak i Java

Et NullPointerException i Java er et RuntimeException. Det oppstår når et program prøver å bruke en objektreferanse som har nullverdien. I Java er 'null' en spesiell verdi som kan tilordnes objektreferanser for å indikere fravær av en verdi.

Årsaker til Null Pointer Unntak

Et NullPointerException oppstår av følgende årsaker: 

  • Påkalle en metode fra et null-objekt.
  • Få tilgang til eller endre et null-objekts felt.
  • Tar lengden på null som om det var en matrise.
  • Å få tilgang til eller endre sporene til null-objekter som om det var en matrise.
  • Kaster null som om det var en kastverdi.
  • Når du prøver å synkronisere over et null-objekt.

Eksempel:

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

Produksjon:

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

Forklaring: I dette eksemplet er strengreferansen 's' null. Når programmet prøver å kalle lengde()-metoden, kaster det et NullPointerException fordi det ikke er noe faktisk objekt.

Hvorfor brukes null i Java?

Nullverdien fungerer som en plassholder, og den indikerer at ingen verdi er tilordnet en referansevariabel. Vanlige applikasjoner inkluderer:

  • Koblede datastrukturer : Den representerer slutten av en liste eller tregren.
  • Design mønstre : Dette brukes i mønstre som Null Object Pattern eller Singleton Pattern.

Hvordan unngå NullPointerException

For å unngå NullPointerException må vi sørge for at alle objektene initialiseres riktig før vi bruker dem. Når vi erklærer en referansevariabel må vi bekrefte at objektet ikke er null før vi ber om en metode eller et felt fra objektene.

1. Bruke strengbokstaver i equals()

Et veldig vanlig kasusproblem involverer sammenligningen mellom en strengvariabel og en bokstavelig. Det bokstavelige kan være en streng eller et element i en Enum. I stedet for å påkalle metoden fra null-objektet, bør du vurdere å påkalle den fra det bokstavelige. 

Eksempel:

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

Produksjon
NullPointerException Caught 

Vi kan unngå NullPointerException ved å kalle lik på bokstavelig i stedet for 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'  );      }      }   }   

Produksjon
Not Same 

Note : Påkall alltid lik på bokstaven for å unngå å kalle en metode på en nullreferanse.

2. Kontroll av metodeargumenter

Før vi kjører brødteksten til den nye metoden, bør vi først sjekke argumentene for nullverdier og fortsette med utførelse av metoden bare når argumentene er riktig sjekket. Ellers vil den kaste et IllegalArgumentException og varsle kallemetoden om at noe er galt med de beståtte argumentene. 

Eksempel:

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

Produksjon
0 13 IllegalArgumentException caught  

3. Bruk ternær operatør

Den ternære operatoren kan brukes for å unngå NullPointerException. Først blir det boolske uttrykket evaluert. Hvis uttrykket er sant, returneres verdi1 ellers returneres verdi2. Vi kan bruke den ternære operatoren for å håndtere null-pekere.

Eksempel:

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

Produksjon
Geeks  

Forklaring : Den ternære operatøren hjelper til med å sjekke for null og unngå operasjoner på nullreferanser.

4. Bruke valgfri klasse (Java 8+)

I Java 8 ble valgfri klasse introdusert som et beholderobjekt som kanskje inneholder en ikke-null-verdi. Det hjelper å unngå NullPointerException ved å tvinge til å eksplisitt behandle saken når en verdi mangler.

Eksempel:

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

Produksjon
Default Name  

Forklaring: Optional.ofNullable(value) bryter verdien som kan være null. orElse() gir en fallback hvis verdien ikke er tilstede.