what is nullpointerexception java how avoid it
In diesem Tutorial wird alles über die NullPointerException in Java erklärt. Wir werden die Ursachen der Nullzeiger-Ausnahme und Möglichkeiten, sie zu vermeiden, diskutieren:
NullPointerException in Java ist eine Laufzeitausnahme. Java weist einer Objektreferenz einen speziellen Nullwert zu. Wenn ein Programm versucht, einen Objektreferenzsatz zu verwenden, der auf den Wert Null gesetzt ist, wird diese Ausnahme ausgelöst.
=> Sehen Sie sich hier die einfache Java-Schulungsreihe an.
Was du lernen wirst:
NullPointerException In Java
Wenn eine Objektreferenz mit einem Nullwert eine NullPointerException auslöst, warum benötigen wir dann einen Nullwert?
Der Nullwert wird normalerweise verwendet, um anzuzeigen, dass einer Referenzvariablen kein Wert zugewiesen wurde. Zweitens benötigen wir Nullwerte für Sammlungen wie verknüpfte Listen und Bäume, um Nullknoten anzuzeigen. Die Entwurfsmuster wie Singleton-Muster verwenden Nullwerte.
Zusammenfassend lässt sich sagen, dass der Nullwert in Java viele Verwendungszwecke hat. Die Nullzeigerausnahme wird in bestimmten Szenarien in Java ausgelöst.
Einige der Szenarien sind wie folgt:
- Methode, die mit einem Nullobjekt aufgerufen wird.
- Zugreifen auf oder Ändern eines Felds oder Datenelements des Nullobjekts.
- Übergabe des Nullobjekts als Argument an eine Methode.
- Berechnung der Länge eines Null-Arrays.
- Zugriff auf den Index eines Null-Arrays.
- Synchronisieren eines Nullobjekts.
- Ein Null-Objekt werfen.
Die Nullzeiger-Ausnahme erstreckt sich von der Klasse RuntimeException.
Die Hierarchie der NullPointerException ist unten angegeben.
Wie in der obigen Hierarchie gezeigt, erstreckt sich die Nullzeigerausnahme von der RuntimeException, die die Ausnahmeklasse erbt. Die Ausnahmeklasse wird wiederum von der Throwable-Klasse abgeleitet, die eine Unterklasse von Object ist.
Ursachen für das Auftreten von java.lang.NullPointerException
Jetzt werden wir jedes der oben aufgeführten Szenarien des Auftretens von NullPointerException demonstrieren.
# 1) Die Methode wird mit einem Null-Objekt aufgerufen
Betrachten Sie das folgende Codebeispiel. Hier haben wir eine Klasse, MyClass, die zwei Methoden bereitstellt. Die erste Methode 'initT' gibt ein Nullobjekt zurück. In der Hauptmethode erstellen wir ein Objekt von MyClass mit einem Aufruf der initT-Methode.
Als nächstes rufen wir die Druckmethode von MyClass auf. Hier wird die java.lang.NullPointerException ausgelöst, wenn wir die print-Methode mit einem Null-Objekt aufrufen.
class MyClass { public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) t.print('Hello, World!'); //invoke method using null object } }
Ausgabe
# 2) Zugriffsfeld eines Nullobjekts
class MyClass { int numField = 100; public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) int num = t.numField; //access MyClass member using null object } }
Ausgabe
zirkuläre Array-Warteschlange c ++
Dies ist eine weitere Ursache für NullPointerException. Hier versuchen wir, mit einem Null-Objekt auf ein Klassenmitglied zuzugreifen. Wir weisen dem Objekt t den Rückgabewert der initT-Methode zu und greifen dann mit dem Objekt t auf numField zu. Das Objekt t ist jedoch ein Nullobjekt, da initT ein Nullobjekt zurückgibt. Zu diesem Zeitpunkt wird die java.lang.NullPointerException ausgelöst.
# 3) Übergeben eines Nullobjekts als Argument
Dies ist die häufigste Ursache für das Auftreten von java.lang.NullPointerException. Betrachten Sie das folgende Java-Programm. Hier haben wir eine Methode 'print_LowerCase', die das als Argument übergebene String-Objekt in Kleinbuchstaben konvertiert.
public class Main { public static void print_LowerCase(String s) { System.out.println(s.toLowerCase()); } public static void main(String() args) { print_LowerCase(null); //pass null object as argument to the method } }
Ausgabe
In der Hauptmethode rufen wir diese Methode auf und übergeben eine Null als Argument. Da das String-Objekt nicht null sein kann, wird die java.lang.NullPointerException ausgelöst.
# 4) Ermitteln der Länge eines Null-Arrays
Der Versuch, die Länge eines Null-Arrays zu berechnen, führt auch dazu, dass java.lang.NullPointerException ausgelöst wird.
Das folgende Programm zeigt dies.
public class Main { public static void main(String() args) { int() dataArray = null; //Array is null; no data System.out.println('Array Length:' + dataArray.length); //print array length } }
Ausgabe
Im obigen Programm deklarieren wir ein Array und weisen ihm null zu, d. H. Keine Daten. Wenn wir die Eigenschaft length für dieses Null-Array verwenden, wird die NullPointerException ausgelöst.
# 5) Zugriffsindex eines Null-Arrays
Ähnlich wie bei der Länge ist dies die Ursache für java.lang.NullPointerException, auch wenn wir versuchen, mithilfe eines Index auf einen Wert in einem Null-Array zuzugreifen.
public class Main { public static void main(String() args) { int() dataArray = null; //Array set to null //access value at index 2 System.out.println('Value at index 2:' + dataArray(2)); } }
Ausgabe
Im obigen Programm versuchen wir, auf den Wert am Index 2 eines Null-Arrays zuzugreifen.
# 6) Synchronisation auf einem Nullobjekt
Normalerweise synchronisieren wir einen Block oder eine Methode, um den gleichzeitigen Zugriff zu erleichtern. Die Objektreferenz, die wir für die Synchronisation verwenden, sollte jedoch nicht null sein. Wenn es sich um ein Nullobjekt handelt, führt dies zu einer java.lang.NullPointerException.
Das folgende Java-Programm demonstriert dies. Wie wir sehen können, haben wir ein String-Objekt 'mutex', das auf null initialisiert wurde. Dann verwenden wir in der Hauptfunktion einen synchronisierten Block mit Mutex als Objektreferenz. Da Mutex null ist, wird java.lang.NullPointerException ausgelöst.
public class Main { public static String mutex = null; //mutex variable set to null public static void main(String() args) { synchronized(mutex) { //synchronized block for null mutex System.out.println('synchronized block'); } } }
Ausgabe
# 7) Durch Werfen von Null
public class Main { public static void main(String() args) { throw null; //throw null } }
Ausgabe:
Im obigen Beispielprogramm wird anstelle eines gültigen Objekts null ausgelöst. Dies führt zu einer Nullzeigerausnahme.
Vermeiden einer Nullzeigerausnahme
Nachdem wir die Ursachen für das Auftreten von NullPointerException erkannt haben, müssen wir auch versuchen, dies in unserem Programm zu vermeiden.
Zunächst müssen wir sicherstellen, dass die Objekte, die wir in unseren Programmen verwenden, ordnungsgemäß initialisiert werden, damit wir die Verwendung von Nullobjekten vermeiden können, die zu einer Nullzeigerausnahme führen. Wir sollten auch darauf achten, dass die im Programm verwendeten Referenzvariablen auf gültige Werte verweisen und nicht versehentlich Nullwerte erfassen.
Abgesehen von diesen Überlegungen können wir von Fall zu Fall mehr Vorsicht walten lassen, um java.lang.NullPointerException zu vermeiden.
Nachfolgend betrachten wir einige Fälle.
# 1) String-Vergleich mit Literalen
Ein Vergleich zwischen der Zeichenfolgenvariablen und einem Literal (tatsächlicher Wert oder Element der Aufzählung) ist in Java-Programmen eine sehr häufige Operation. Wenn die String-Variable, die ein Objekt ist, jedoch null ist, wird beim Vergleich dieses Null-Objekts mit Literalen eine NullPointerException ausgelöst.
Die Lösung besteht also darin, die Vergleichsmethode aus dem Literal anstelle des String-Objekts aufzurufen, das null sein kann.
Das folgende Programm zeigt, wie wir Vergleichsmethoden aus Literalen aufrufen und java.lang.NullPointerException vermeiden können.
class Main { public static void main (String() args) { // String set to null String myStr = null; // Checking if myStr is null using try catch. try { if ('Hello'.equals(myStr)) //use equals method with literal System.out.print('Two strings are same'); else System.out.print('Strings are not equal'); } catch(NullPointerException e) { System.out.print('Caught NullPointerException'); } } }
Ausgabe
# 2) Überprüfen Sie die Argumente einer Methode
Überprüfen Sie die Argumente der Methode, um sicherzustellen, dass es sich nicht um Nullwerte handelt. Wenn die Argumente nicht der Spezifikation entsprechen, löst der Code eine IllegalArgumentException aus, um anzuzeigen, dass die Argumente nicht den Erwartungen entsprechen.
Dies wird im folgenden Java-Programm gezeigt.
import java.io.*; class Main { public static void main (String() args) { // set String to empty value String myStr = ''; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to a proper value and call getLength myStr = 'Far from home'; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to null and call getLength() myStr = null; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } } // Method that returns length of the String public static int getLength(String myStr) { if (myStr == null) //throw Exception if String is null throw new IllegalArgumentException('The String argument cannot be null'); return myStr.length(); } }
Ausgabe
# 3) Verwendung des ternären Operators zur Pflege von Nullwerten
Wir können den ternären Operator verwenden, um java.lang.NullPointerException zu vermeiden. Der ternäre Operator hat drei Operatoren. Der erste ist ein boolescher Ausdruck, der als wahr oder falsch ausgewertet wird. Wenn der Ausdruck wahr ist, wird der zweite Operator oder der dritte Operator zurückgegeben.
Das folgende Programm zeigt die Verwendung eines ternären Operators, um NullPointerException zu vermeiden.
import java.io.*; class Main { public static void main (String() args) { // Initialize String with null value String myStr = null; //return a substring for this String using ternary oprator String myVal = (myStr == null) ? '' : myStr.substring(0,5); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); // Now set a value for String myStr = 'SoftwareTestingHelp'; //return a substring for this String using ternary oprator myVal = (myStr == null) ? '' : myStr.substring(0,8); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); }
Ausgabe
Häufig gestellte Fragen
F # 1) Wie behebe ich NullPointerException in Java?
Antworten: Wir müssen sicherstellen, dass alle im Programm verwendeten Objekte ordnungsgemäß initialisiert werden und keine Nullwerte haben. Außerdem sollten die Referenzvariablen keine Nullwerte haben.
# 2) Ist die NullPointerException aktiviert oder deaktiviert?
Antworten: NullPointerException ist keine aktivierte Ausnahme. Es ist ein Nachkomme von RuntimeException und nicht aktiviert.
# 3) Wie stoppe ich die NullPointerException?
Antworten: Einige der Best Practices zur Vermeidung von NullPointerException sind:
- Verwenden Sie die Methoden equals () und equalsIgnoreCase () mit dem String-Literal, anstatt sie für das unbekannte Objekt zu verwenden, das null sein kann.
- Verwenden Sie valueOf () anstelle von toString (). und beide geben das gleiche Ergebnis zurück.
- Verwenden Sie die Java-Annotation @NotNull und @Nullable.
# 4) Was ist der Nullwert in Java?
Antworten: Ein Nullwert bezieht sich nicht auf ein Objekt oder eine Variable. Es ist ein Schlüsselwort und ein Literal. Es stellt eine Nullreferenz dar.
# 5) Können wir NullPointerException in Java abfangen?
Antworten: Die Ausnahme java.lang.NullPointerException ist eine nicht aktivierte Ausnahme und erweitert die RuntimeException-Klasse. Daher besteht für den Programmierer kein Zwang, es zu fangen.
Fazit
In diesem Tutorial haben wir die NullPointerException in Java erläutert. Dies ist eine ziemlich gefährliche Ausnahme und kann normalerweise auftreten, wenn wir es am wenigsten erwarten. Eine Nullzeigerausnahme tritt meistens aufgrund des Nullobjekts oder der Nullreferenz auf. Wir haben bereits die Ursachen und Möglichkeiten zur Vermeidung von NullPointerException gesehen.
Der Programmierer sollte so weit wie möglich versuchen, das Auftreten einer Nullzeigerausnahme in einem Programm zu vermeiden. Da dies eine ungeprüfte Laufzeitausnahme ist, sollten wir sehen, dass sie nicht auftritt, wenn die Anwendung ausgeführt wird.
=> Besuchen Sie hier, um Java von Grund auf neu zu lernen.
Literatur-Empfehlungen
- Java-Ausnahmen und Ausnahmebehandlung mit Beispielen
- Wie gehe ich mit der ArrayIndexOutOfBoundsException in Java um?
- Tutorial zur Behandlung von C # -Ausnahmen mit Codebeispielen
- Vollständige Anleitung zur Behandlung von PL SQL-Ausnahmen mit Beispielen
- So behandeln Sie Ausnahmen in SoapUI Groovy-Skripten - SoapUI Tutorial # 11
- Python Try Except - Python-Ausnahmebehandlung mit Beispielen
- Behandlung von JDBC-Ausnahmen - Umgang mit SQL-Ausnahmen
- Ausnahmebehandlung in C ++