Null Pointer Undtagelse i Java

En NullPointerException i Java er en RuntimeException. Det opstår, når et program forsøger at bruge en objektreference, der har nulværdien. I Java er 'null' en speciel værdi, der kan tildeles objektreferencer for at indikere fraværet af en værdi.

Årsager til Null Pointer-undtagelse

En NullPointerException opstår af følgende årsager: 

  • Fremkaldelse af en metode fra et nul-objekt.
  • Adgang til eller ændring af et nul-objekts felt.
  • Tager længden af ​​null, som om det var en matrix.
  • Adgang til eller ændring af pladserne i nul-objekter, som om det var et array.
  • Kaster null, som om det var en Kasteværdi.
  • Når du forsøger at 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  ());         }   }   

Produktion:

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

Forklaring: I dette eksempel er strengreferencen 's' null. Når programmet forsøger at kalde length()-metoden, kaster det en NullPointerException, fordi der ikke er noget egentligt objekt.

Hvorfor bruges null i Java?

Null-værdien fungerer som en pladsholder, og den indikerer, at der ikke er tildelt nogen værdi til en referencevariabel. Almindelige applikationer omfatter:

  • Sammenkædede datastrukturer : Det repræsenterer slutningen af ​​en liste eller en trægren.
  • Design mønstre : Dette bruges i mønstre som Null Object Pattern eller Singleton Pattern.

Sådan undgår du NullPointerException

For at undgå NullPointerException skal vi sikre, at alle objekterne initialiseres korrekt, før vi bruger dem. Når vi erklærer en referencevariabel, skal vi verificere, at objektet ikke er null, før vi anmoder om en metode eller et felt fra objekterne.

1. Brug af strenge bogstaver i equals()

Et meget almindeligt kasusproblem involverer sammenligningen mellem en strengvariabel og en bogstavelig. Det bogstavelige kan være en streng eller et element i en Enum. I stedet for at påberåbe metoden fra null-objektet, så overvej at påberåbe den fra det bogstavelige. 

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

Produktion
NullPointerException Caught 

Vi kan undgå NullPointerException ved at kalde equals på literal 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'  );      }      }   }   

Produktion
Not Same 

Note : Kald altid lig på bogstavet for at undgå at kalde en metode på en nulreference.

2. Kontrolmetodeargumenter

Før vi udfører brødteksten af ​​den nye metode, bør vi først kontrollere dens argumenter for nulværdier og kun fortsætte med udførelse af metoden, når argumenterne er korrekt kontrolleret. Ellers vil den kaste en IllegalArgumentException og give den kaldende metode besked om, at der er noget galt med de beståede argumenter. 

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

Produktion
0 13 IllegalArgumentException caught  

3. Brug ternær operatør

Den ternære operator kan bruges til at undgå NullPointerException. Først evalueres det boolske udtryk. Hvis udtrykket er sandt, returneres værdi1 ellers returneres værdi2. Vi kan bruge den ternære operator til at håndtere nul pointere.

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

Produktion
Geeks  

Forklaring : Den ternære operator hjælper med at tjekke for nul og undgå operationer på nul-referencer.

4. Brug af valgfri klasse (Java 8+)

I Java 8 blev valgfri klasse introduceret som et containerobjekt, der muligvis indeholder en ikke-null værdi. Det hjælper med at undgå NullPointerException ved at tvinge til eksplicit at håndtere sagen, når en værdi er fraværende.

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

Produktion
Default Name  

Forklaring: Optional.ofNullable(value) ombryder værdien, som kan være null. orElse() giver et fallback, hvis værdien ikke er til stede.