JavaRush /Java-Blog /Random-DE /Tricks und Tipps. So vermeiden Sie NullPointerException i...
DarthVictor
Level 28

Tricks und Tipps. So vermeiden Sie NullPointerException in Java-Anwendungen

Veröffentlicht in der Gruppe Random-DE
Tricks und Tipps.  So vermeiden Sie NullPointerException in Java-Anwendungen – 1Heute zeige ich Ihnen einfache Techniken, wie Sie NullPointerException in Ihren Anwendungen vermeiden können. Sie sind leicht zu befolgen, verbessern jedoch die Zuverlässigkeit und Qualität Ihres Codes erheblich. Darüber hinaus hat meiner Erfahrung nach der erste Tipp spürbare Auswirkungen auf die Qualität Ihres Codes. Wenn Sie weitere Java-Programmiertricks kennen, teilen Sie diese gerne in den Kommentaren mit. Tricks und Tipps.  So vermeiden Sie NullPointerException in Java-Anwendungen - 2

Rufen Sie die Methoden equal() und equalIgnoreCase() für ein bekanntes Zeichenfolgenliteral und nicht für ein unbekanntes Objekt auf

Rufen Sie immer eine Methode equals()für eine bekannte Zeichenfolge auf, von der Sie wissen, dass sie keine ist null. Die Methode equals()ist symmetrisch, das heißt, sie ruft auf a.equals(b)und b.equals(a)liefert das gleiche Ergebnis (wenn aund bnicht null), und aus diesem Grund achten viele Programmierer nicht darauf, welche Objekte aufgerufen werden equals(), y aoder y b. Eine der Nebenwirkungen davon ist eine NullPointerException, wenn die Methode aufgerufen wird null.
Object unknownObject = null;

//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
   System.err.println("This may result in NullPointerException if unknownObject is null");
}

//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
    System.err.println("better coding avoided NullPointerException");
}
Dies war der einfachste Tipp zur Vermeidung von NullPointerException, aber er allein stellt eine enorme Verbesserung dar, da die Methode equals()überall zu finden ist.

Wählen Sie valueOf() anstelle von toString() in Fällen, in denen beide das gleiche Ergebnis liefern

Da der Aufruf toString()einer Referenz mit einem Wert nulleine NullPointerException auslöst, ist es besser, den Aufruf zu verwenden valueOf(), wenn wir das gleiche Ergebnis erhalten können, da der Aufruf valueOf()von nullzurückgibt null. Dies gilt insbesondere für Wrapper - Klassen wie Integer, oder . FloatDoubleBigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
Verwenden Sie diese Tipps, wenn Sie nicht sicher sind, ob ein Objekt existieren kann nulloder nicht.

Verwenden Sie nullsichere Methoden und Bibliotheken

Es gibt viele Open-Source-Bibliotheken, die die schwere Testlast für . übernehmen null. Einer der häufigsten stammt StringUtilsvon Apache Commons. Mit Methoden wie StringUtils.isBlank(), isNumeric()usw. isWhiteSpace()Sie müssen sich keine Sorgen machen, dass eine NullPointerException ausgelöst wird.
//Методы StringUtils являются null-безопасными, они не вызовут NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
Ausgabe: wahr wahr falsch falsch Vergessen Sie jedoch nicht, vor der Verwendung die Dokumentation nullsicherer Methoden und Klassen zu lesen. Dies ist ein weiterer der besten Java-Tricks, der ohne großen Aufwand zu enormen Verbesserungen führt.

Versuchen Sie, nicht von einer Methode zurückzukehren null. Es ist besser, eine leere Sammlung zurückzugeben

Dies ist ein weiterer guter Java-Programmiertipp, den Joshua Bloch in seinem Buch Java: Effective Programming beschreibt. Stellen Sie bei der Rückgabe leerer Sammlungen oder Arrays sicher, dass der Aufruf von Basismethoden wie size()oder length()keine NullPointerException auslöst. Die Klasse Collectionsdeklariert speziell praktische Implementierungen leerer Listen, Mengen und Wörterbücher: Collections.EMPTY_LIST, Collections.EMPTY_SETund Collections.EMPTY_MAP. Zum Beispiel:
public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}
Ebenso können Sie Collections.EMPTY_SETes Collections.EMPTY_MAPanstelle von return verwenden null.

Verwenden Sie die Annotationen @NotNull und @Nullable

In der Beschreibung Ihrer Methoden können Sie nullmithilfe von Annotationen und @Nullable Methodensicherheitskonventionen definieren @NotNull, um anzugeben, ob eine Methode zurückkehren kann nulloder nicht. Moderne Compiler und IDEs können diese Annotationen verwenden, um Ihren Code zu analysieren und entsprechende Ratschläge zu geben, beispielsweise zum Fehlen einer Prüfung für nulloder umgekehrt, zu der Möglichkeit, eine unnötige Prüfung zu entfernen, die den Code verstopft. Solche Annotationen werden beispielsweise von der IntelliJ IDE und FindBugs unterstützt und sind auch in JSR 305 enthalten. Aber selbst wenn Ihre IDE solche Annotationen nicht unterstützt, sind sie an sich schon eine gute Dokumentation. @NotNullWenn Sie sich das ansehen @Nullable, wird es für den Programmierer einfacher zu verstehen, wo eine Prüfung hinzugefügt werden muss nullund wo nicht. Dies ist übrigens eine ziemlich neue Praxis unter Java-Programmierern, und es wird einige Zeit dauern, bis sie sich verbreitet.

Vermeiden Sie unnötiges Autoboxing und Autounboxing in Ihrem Code

Dies führt nicht nur zur Erstellung unnötiger temporärer Objekte, sondern Autoboxing kann auch eine NullPointerException auslösen, wenn die Wrapper-Klasse ist null. Der folgende Code löst beispielsweise eine NullPointerException aus, wenn der Personeneintrag keine Telefonnummer enthält, und gibt zurück null.
Person ram = new Person("ram");
int phone = ram.getPhone();
Bei der Verwendung von Autoboxing oder Autounboxing können nicht nur Gleichheiten, sondern auch Ungleichheiten <> >zu einer NullPointerException führen.

Befolgen Sie Konventionen und definieren Sie sinnvolle Standardwerte.

Eine der besten Möglichkeiten, NullPointerException in Java zu vermeiden, besteht darin, die Codierungskonventionen ordnungsgemäß zu deklarieren und zu befolgen. Die meisten NullPointerExceptions treten auf, wenn Sie versuchen, ein Objekt zu erstellen, ohne über alle erforderlichen Daten und Abhängigkeiten zu verfügen. Indem Sie die Erstellung unvollendeter Objekte verhindern, indem Sie solche Anfragen ordnungsgemäß ablehnen, ersparen Sie sich in Zukunft eine große Anzahl von NullPointerExceptions. Wenn Sie die Objekterstellung zulassen, sollten Sie ebenfalls einen angemessenen Standardwert wählen. Beispielsweise kann ein Klassenobjekt Employeenicht ohne Namen und erstellt werden id, darf aber keine Telefonnummer haben. In diesem Fall können Objekte Employeeohne Zahl stattdessen Null zurückgeben null. Obwohl ein solches Verhalten des Objekts im Voraus durchdacht werden sollte, ist es möglicherweise einfacher, dies zu überprüfen, nullals eine nicht vorhandene Nummer anzurufen. nullIn diesem Fall helfen zusätzliche Bedingungen dazu, welche Felder vorhanden sind und welche nicht, die richtige Entscheidung zu treffen. Im Allgemeinen ist die Wahl zwischen dem sofortigen Absturz des Programms oder der Zuweisung nulleine wichtige Entwurfsentscheidung, und wenn Sie die Wahl einmal getroffen haben, müssen Sie sie konsequent befolgen.

Legen Sie Einschränkungen auf DBMS-Ebene fest

Wenn Sie eine Datenbank zum Speichern Ihrer Programmobjekte wie Kunden oder Bestellungen verwenden, ist es ratsam, die „ nullNess“ Ihrer Objekte auf DBMS-Ebene anzugeben und dabei entsprechende Tabellenbeschränkungen zu verwenden. Datenbanken enthalten häufig Informationen aus mehreren Quellen, und die Einführung von Überprüfungen auf fehlende Werte verbessert die Integrität Ihrer Daten. Darüber hinaus werden durch das Vorhandensein von Nullprüfungen auf DBMS-Ebene diese in Ihrem Java-Code reduziert: Durch das Laden von Daten aus der Datenbank in Java-Objekte können Sie sicher sein, dass sie vorhanden sind, und unnötige „ != null“ aus dem Programmcode entfernen.

Verwenden Sie das Nullobjektmuster

Das Erstellen spezieller Null-Objekte ist eine weitere Möglichkeit, NullPointerExcpetion in Java zu vermeiden. Nehmen wir an, dass eine Methode in unserer Anwendung ein Objekt zurückgibt, mit dem das Programm anschließend arbeitet, indem es seine Methoden aufruft. Beispielsweise gibt die Methode Collection.iterator()ein Objekt der Klasse zurück Iterator, das zum Durchlaufen der Sammlung verwendet wird. Wenn das ursprüngliche Objekt dann keinen Iterator hat, nullkönnen Sie stattdessen ein spezielles Null-Objekt zurückgeben, das über eine Methode verfügt hasNext(), die immer zurückgibt false. Das ist alles, lieber Leser, hier beende ich meine Tipps zum Beseitigen von NullPointerException-Fehlern in Java-Programmen. Sie werden zu schätzen wissen, wie nützlich diese einfachen und nicht belastenden Regeln sein können. Zur Erinnerung: Wenn Sie weitere NullPointerException-Tricks in Java-Programmen teilen möchten, können Sie dies gerne in den Kommentaren tun. Speziell für JavaRush-Studenten übersetzt. Original
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION