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.