Heute 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.
Verwenden Sie
Es gibt viele Open-Source-Bibliotheken, die die schwere Testlast für . übernehmen Versuchen Sie, nicht von einer Methode zurückzukehren
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
Rufen Sie die Methoden equal() und equalIgnoreCase() für ein bekanntes Zeichenfolgenliteral und nicht für ein unbekanntes Objekt auf
Rufen Sie immer eine Methodeequals()
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 a
und b
nicht null
), und aus diesem Grund achten viele Programmierer nicht darauf, welche Objekte aufgerufen werden equals()
, y a
oder 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 AufruftoString()
einer Referenz mit einem Wert null
eine NullPointerException auslöst, ist es besser, den Aufruf zu verwenden valueOf()
, wenn wir das gleiche Ergebnis erhalten können, da der Aufruf valueOf()
von null
zurückgibt null
. Dies gilt insbesondere für Wrapper - Klassen wie Integer
, oder . Float
Double
BigDecimal
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 null
oder nicht.
Verwenden Sie null
sichere Methoden und Bibliotheken
Es gibt viele Open-Source-Bibliotheken, die die schwere Testlast für . übernehmen null
. Einer der häufigsten stammt StringUtils
von 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 null
sicherer 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 Collections
deklariert speziell praktische Implementierungen leerer Listen, Mengen und Wörterbücher: Collections.EMPTY_LIST
, Collections.EMPTY_SET
und Collections.EMPTY_MAP
. Zum Beispiel:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
Ebenso können Sie Collections.EMPTY_SET
es Collections.EMPTY_MAP
anstelle von return verwenden null
.
Verwenden Sie die Annotationen @NotNull und @Nullable
In der Beschreibung Ihrer Methoden können Sienull
mithilfe von Annotationen und @Nullable Methodensicherheitskonventionen definieren @NotNull
, um anzugeben, ob eine Methode zurückkehren kann null
oder 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 null
oder 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. @NotNull
Wenn Sie sich das ansehen @Nullable
, wird es für den Programmierer einfacher zu verstehen, wo eine Prüfung hinzugefügt werden muss null
und 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 istnull
. 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 KlassenobjektEmployee
nicht ohne Namen und erstellt werden id
, darf aber keine Telefonnummer haben. In diesem Fall können Objekte Employee
ohne 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, null
als eine nicht vorhandene Nummer anzurufen. null
In 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 null
eine 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 „null
Ness“ 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 speziellerNull
-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, null
kö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
GO TO FULL VERSION