Nullzeiger-Ausnahme in Java

Eine NullPointerException in Java ist eine RuntimeException. Es tritt auf, wenn ein Programm versucht, eine Objektreferenz zu verwenden, die den Nullwert hat. In Java ist „null“ ein spezieller Wert, der Objektreferenzen zugewiesen werden kann, um das Fehlen eines Werts anzuzeigen.

Gründe für eine Nullzeiger-Ausnahme

Eine NullPointerException tritt aus folgenden Gründen auf: 

  • Aufrufen einer Methode von einem Nullobjekt.
  • Auf das Feld eines Nullobjekts zugreifen oder es ändern.
  • Nimm die Länge von null, als wäre es ein Array.
  • Auf die Slots von Nullobjekten zugreifen oder diese ändern, als wäre es ein Array.
  • Wirft null aus, als wäre es ein Throwable-Wert.
  • Wenn Sie versuchen, über ein Nullobjekt zu synchronisieren.

Beispiel:

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

Ausgabe:

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

Erläuterung: In diesem Beispiel ist die Zeichenfolgenreferenz „s“ null. Wenn das Programm versucht, die Methode length() aufzurufen, löst es eine NullPointerException aus, da kein tatsächliches Objekt vorhanden ist.

Warum wird null in Java verwendet?

Der Nullwert dient als Platzhalter und zeigt an, dass einer Referenzvariablen kein Wert zugewiesen ist. Zu den gängigen Anwendungen gehören:

  • Verknüpfte Datenstrukturen : Es stellt das Ende einer Liste oder eines Baumzweigs dar.
  • Designmuster : Dies wird in Mustern wie dem Null-Objekt-Muster oder dem Singleton-Muster verwendet.

So vermeiden Sie NullPointerException

Um die NullPointerException zu vermeiden, müssen wir sicherstellen, dass alle Objekte ordnungsgemäß initialisiert werden, bevor wir sie verwenden. Wenn wir eine Referenzvariable deklarieren, müssen wir sicherstellen, dass das Objekt nicht null ist, bevor wir eine Methode oder ein Feld von den Objekten anfordern.

1. Verwendung von String-Literalen in equal()

Ein sehr häufiges Fallproblem betrifft den Vergleich zwischen einer String-Variablen und einem Literal. Das Literal kann ein String oder ein Element einer Enum sein. Anstatt die Methode vom Nullobjekt aus aufzurufen, sollten Sie sie auch vom Literal aus aufrufen. 

Beispiel:

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

Ausgabe
NullPointerException Caught 

Wir können NullPointerException vermeiden, indem wir equal für ein Literal statt für ein Objekt aufrufen.

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

Ausgabe
Not Same 

Notiz : Rufen Sie immer equal für das Literal auf, um den Aufruf einer Methode für eine Nullreferenz zu vermeiden.

2. Methodenargumente prüfen

Bevor wir den Hauptteil der neuen Methode ausführen, sollten wir zunächst deren Argumente auf Nullwerte überprüfen und mit der Ausführung der Methode erst fortfahren, wenn die Argumente ordnungsgemäß überprüft wurden. Andernfalls wird eine IllegalArgumentException ausgelöst und die aufrufende Methode benachrichtigt, dass mit den übergebenen Argumenten etwas nicht stimmt. 

Beispiel:

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

Ausgabe
0 13 IllegalArgumentException caught  

3. Verwenden Sie den ternären Operator

Der ternäre Operator kann verwendet werden, um NullPointerException zu vermeiden. Zunächst wird der boolesche Ausdruck ausgewertet. Wenn der Ausdruck wahr ist, wird der Wert1 zurückgegeben, andernfalls wird der Wert2 zurückgegeben. Wir können den ternären Operator zur Behandlung von Nullzeigern verwenden.

Beispiel:

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

Ausgabe
Geeks  

Erläuterung : Der ternäre Operator hilft bei der Überprüfung auf Null und vermeidet Operationen mit Nullreferenzen.

4. Verwendung der optionalen Klasse (Java 8+)

In Java 8 wurde die optionale Klasse als Containerobjekt eingeführt, das einen Wert ungleich Null enthalten kann oder nicht. Es hilft zu vermeiden NullPointerException indem man erzwingt, den Fall explizit zu behandeln, wenn ein Wert fehlt.

Beispiel:

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

Ausgabe
Default Name  

Erläuterung: Optional.ofNullable(value) umschließt den Wert, der möglicherweise null ist. orElse() bietet einen Fallback, wenn der Wert nicht vorhanden ist.