Umgang mit NullPointerException in Java

Wenn Sie einige Zeit damit verbracht haben, Programme in Java zu entwickeln, haben Sie irgendwann definitiv die folgende Ausnahme gesehen:

java.lang.NullPointerException

Einige wichtige Produktionsprobleme ergeben sich aus NullPointerException. In diesem Artikel werden einige Möglichkeiten zur Handhabung NullPointerExceptionin Java beschrieben.

Einfache Nullprüfung

Betrachten Sie den folgenden Code:

public static void main(String args[]) { String input1 = null; simpleNullCheck(input1); } private static void simpleNullCheck(String str1) { System.out.println(str1.length()); }

Wenn Sie diesen Code unverändert ausführen, wird die folgende Ausnahme angezeigt:

Exception in thread "main" java.lang.NullPointerException

Der Grund, warum Sie diesen Fehler erhalten, ist, dass wir versuchen, das auszuführen length()Operation, auf str1der ist null.

Eine einfache Lösung hierfür ist das Hinzufügen einer Nullprüfung str1Wie nachfolgend dargestellt:

private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } }

Dadurch wird sichergestellt, dass wann str1istnullführen Sie das nicht aus length()Funktion darauf.

Möglicherweise haben Sie jedoch die folgende Frage.

Was ist, wenn str1 eine wichtige Variable ist?

In diesem Fall können Sie Folgendes ausprobieren:

 private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } else { // Perform an alternate action when str1 is null // Print a message saying that this particular field is null and hence the program has to stop and cannot continue further. } }

Die Idee ist, dass es nullbesser ist, nulldiese Variable zu überprüfen , wenn Sie einen Wert erwarten . Und wenn sich herausstellt, dass der Wert ist null, ergreifen Sie eine alternative Maßnahme.

Dies gilt nicht nur für Zeichenfolgen, sondern für jedes andere Objekt in Java.

Lombok Null Check

Nehmen Sie nun das folgende Beispiel:

public static void main(String args[]) { String input2 = "test"; List inputList = null; lombokNullCheck(input2, inputList, input2); } public static void lombokNullCheck(String str1, List strList, String str2) { System.out.println(str1.length() + strList.size() + str2.length()); }

Hier haben wir eine Funktion , die drei Argumente akzeptiert: str1, strList, und str2.

Wenn sich herausstellt, dass einer dieser Werte vorliegt, nullmöchten wir die Logik in dieser Funktion überhaupt nicht ausführen.

Wie erreichen Sie das?

Hier kommt Lombok zum Einsatz. Fügen Sie die folgende Maven-Abhängigkeit hinzu, um die Lombok-Bibliothek in Ihren Code aufzunehmen:

  org.projectlombok lombok 1.18.12 provided 

Weitere Informationen zu Maven finden Sie in diesem Artikel.

So würde der Code mit dem Lombok- nullCheck aussehen :

public static void main(String args[]) { String input2 = "test"; List inputList = null; try { lombokNullCheck(input2, inputList, input2); } catch (NullPointerException e) { System.out.println(e); } } public static void lombokNullCheck(@NonNull String str1, @NonNull List strList, @NonNull String str2) { System.out.println(str1.length() + strList.size() + str2.length()); }

Vor jedem Argument der Funktion fügen wir hinzu @NonNullAnmerkung.

Auch wenn wir diese Funktion aufrufen, setzen wir einen try-catchBlock um den Funktionsaufruf, um ihn abzufangen NullPointerException.

Wenn sich herausstellt, dass eines der in der Funktion angegebenen Argumente vorliegt null, würde die Funktion a auslösen NullPointerException. Dies würde dann vom try-catchBlock erfasst werden.

Dies stellt sicher, dass, wenn sich eines der Funktionsargumente herausstellt null, die Logik in der Funktion nicht ausgeführt wird und wir wissen, dass sich der Code nicht ungewöhnlich verhält.

Dies kann auch mit einer Reihe von nullCheck-Anweisungen erfolgen. Die Verwendung von Lombok hilft uns jedoch, das Schreiben mehrerer Prüfanweisungen zu vermeiden, nullund lässt den Code viel sauberer aussehen.

Listen und Nullen

Angenommen, Sie haben eine Liste und möchten alle Elemente in der Liste drucken:

List stringList = new ArrayList(); stringList.add("ele1"); stringList.add("ele2"); if (stringList != null) { for (String element : stringList) System.out.println(element); }

Bevor wir die Liste durchlaufen, müssen wir nulldie Liste überprüfen.

Wenn die nullPrüfung nicht vorhanden ist, wird beim Versuch, eine nullListe zu durchlaufen, a ausgelöst NullPointerException.

Karten und Nullen

Nehmen wir das Szenario, in dem Sie auf den Wert für einen bestimmten Schlüssel in einer Karte zugreifen müssen:

Map testMap = new HashMap(); testMap.put("first_key", "first_val"); if (testMap != null && testMap.containsKey("first_key")) { System.out.println(testMap.get("first_key")); }

Zuerst müssen wir das Kartenobjekt selbst einer Nullprüfung unterziehen. Wenn dies nicht getan wird und die Karte ist null, NullPointerExceptionwird a geworfen. Dies geschieht mittestMap!=null

Überprüfen Sie anschließend, ob ein bestimmter Schlüssel vorhanden ist, bevor Sie darauf zugreifen. Sie können das Vorhandensein des Schlüssels mit überprüfen testMap.containsKey("first_key"). Wenn dies nicht erfolgt und der jeweilige Schlüssel fehlt, erhalten Sie den Wert als null.

Muss immer ein Null Check hinzugefügt werden?

Wenn Sie sicher sind, dass eine bestimmte Variable niemals sein nullkann, können Sie das Hinzufügen der nullPrüfung vermeiden . Dies gilt möglicherweise für private Funktionen, bei denen Sie die in Funktion gehenden Daten steuern können.

Wenn Sie sich jedoch nicht sicher sind, ob ein Objekt nullbar ist, fügen Sie am besten eine nullPrüfung hinzu.

Code

Der gesamte in diesem Artikel beschriebene Code befindet sich in diesem Github-Repo.

Herzlichen Glückwunsch ?

Sie wissen jetzt, wie Sie mit NullPointerExceptionJava umgehen !

Über den Autor

Ich liebe Technologie und verfolge Fortschritte auf diesem Gebiet. Ich helfe auch gerne anderen mit meinen technischen Kenntnissen.

Lesen Sie weitere Artikel in meinem Blog, verbinden Sie sich mit mir auf LinkedIn oder folgen Sie mir auf Twitter.