Heim  >  Artikel  >  Java  >  So vermeiden Sie NullPointerException in Java

So vermeiden Sie NullPointerException in Java

黄舟
黄舟Original
2017-09-07 10:31:111665Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zur Zusammenfassung der Methoden zur Vermeidung von NullPointerException (Nullzeiger) in Java vorgestellt. Freunde, die sie benötigen, können sich auf

Zusammenfassung der Methoden zur Vermeidung von NullPointerException (Nullzeiger) beziehen ) in Java

In Java-Anwendungen ausgelöste Nullzeigerausnahmen sind der beste Weg, Nullzeiger zu lösen und sind auch der Schlüssel zum Schreiben robuster Programme, die reibungslos funktionieren. Wie das Sprichwort sagt: „Vorbeugen ist besser als heilen“, gilt dieser Satz auch für solch eine lästige Null-Pointer-Ausnahme. Glücklicherweise können Sie Nullzeiger-Ausnahmen in Java weitgehend kontrollieren, indem Sie einige defensive Codierungstechniken anwenden und die Verbindungen zwischen mehreren Teilen Ihrer Anwendung verfolgen. Übrigens ist dies der zweite NullPointerException-Beitrag auf Javarevisited. Im vorherigen Beitrag haben wir die häufigsten Ursachen von Nullzeiger-Ausnahmen in Java besprochen und in diesem Tutorial lernen wir einige Tipps und Best Practices für die Java-Programmierung kennen. Diese Tipps können Ihnen helfen, Nullzeigerausnahmen in Java zu vermeiden. Das Befolgen dieser Tipps kann auch die Anzahl der in Ihrem Java-Code vorhandenen Nicht-Null-Prüfungen reduzieren. Als erfahrener Java-Programmierer kennen Sie wahrscheinlich bereits einige dieser Techniken und wenden sie in Ihren Projekten an. Für unerfahrene und fortgeschrittene Entwickler wird es sich jedoch durchaus lohnen, es zu lernen. Übrigens, wenn Sie weitere Java-Tricks kennen, um Nullzeiger-Ausnahmen zu vermeiden und Nullzeigerprüfungen zu reduzieren, teilen Sie sie uns bitte mit.

Dies sind einfache Techniken, die leicht anzuwenden sind, aber einen erheblichen Einfluss auf die Qualität und Robustheit des Codes haben. Meiner Erfahrung nach verbessert nur der erste Tipp die Codequalität deutlich. Wie ich bereits sagte: Wenn Sie Java-Tricks zur Vermeidung von Nullzeigerausnahmen und zur Reduzierung von Nullzeigerprüfungen kennen, können Sie diese durch einen Kommentar zu diesem Artikel teilen.

1) Rufen Sie die Methoden equal() und equalIgnoreCase() von bekannten String-Objekten auf, nicht von unbekannten Objekten.

Rufen Sie die Methode equal() immer von einem bekannten Nicht-Null-String-Objekt aus auf. Da die Methode equal() symmetrisch ist, sind die Aufrufe von a.equals(b) und b.equals(a) genau gleich, weshalb Programmierer so nachlässig mit den Objekten a und b umgehen. Wenn der Aufrufer ein Nullzeiger ist, kann dieser Aufruf eine NullPointerException verursachen


Object unknownObject = null;

//错误方式 – 可能导致 NullPointerException
if(unknownObject.equals("knownObject")){
  System.err.println("This may result in NullPointerException if unknownObject is null");
}

//正确方式 - 即便 unknownObject是null也能避免NullPointerException
if("knownObject".equals(unknownObject)){
  System.err.println("better coding avoided NullPointerException");
}

Dies ist der einfachste Java-Trick, um eine NullPointerException zu vermeiden, kann aber seit Equals zu einer enormen Verbesserung führen () ist eine gängige Methode.

2) Wenn valueOf() und toString() das gleiche Ergebnis zurückgeben, verwenden Sie lieber ersteres.

Da der Aufruf von toString() für ein Nullobjekt eine Nullzeigerausnahme auslöst. Wenn wir valueOf() verwenden können, um denselben Wert zu erhalten, würden wir lieber valueOf() verwenden und eine Null an übergeben valueOf() Gibt „null“ zurück, insbesondere in Wrapper-Klassen wie Integer, Float, Double und BigDecimal.


BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //不会抛出空指针异常
System.out.println(bd.toString()); //抛出 "Exception in thread "main" java.lang.NullPointerException"

3) Verwenden Sie nullsichere Methoden und Bibliotheken. Es gibt viele Open-Source-Bibliotheken, die Ihnen bereits die schwere Arbeit der Nullzeigerprüfung abnehmen. Eines der am häufigsten verwendeten ist StringUtils in Apache Commons. Sie können StringUtils.isBlank(), isNumeric(), isWhiteSpace() und andere Dienstprogrammmethoden verwenden, ohne sich Gedanken über Nullzeigerausnahmen machen zu müssen.


//StringUtils方法是空指针安全的,他们不会抛出空指针异常
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));

Output:
true
true
false
false

Aber bevor Sie eine Schlussfolgerung ziehen, vergessen Sie nicht, die Dokumentation der Klasse mit der Nullzeigermethode zu lesen. Dies ist eine weitere bewährte Methode für Java, die ohne großen Aufwand erheblich verbessert werden kann.

4) Vermeiden Sie die Rückgabe von Nullzeigern von Methoden, sondern geben Sie stattdessen eine leere Sammlung oder ein leeres Array zurück.

Diese Java-Best Practice oder dieser Trick wird von Joshua Bloch in seinem Buch Effective Java erwähnt. Dies ist ein weiterer Tipp, um die Programmierung in Java zu verbessern. Durch die Rückgabe einer leeren Sammlung oder eines leeren Arrays können Sie sicherstellen, dass Aufrufe wie size() und length() nicht aufgrund einer Nullzeigerausnahme abstürzen. Die Collections-Klasse stellt praktische leere Listen, Mengen und Karten bereit: Collections.EMPTY_LIST, Collections.EMPTY_SET, Collections.EMPTY_MAP. Hier sind Beispiele.


public List getOrders(Customer customer){
  List result = Collections.EMPTY_LIST;
  return result;
}

Sie können anstelle des Nullzeigers auch Collections.EMPTY_SET und Collections.EMPTY_MAP verwenden.

5) Verwenden Sie beim Schreiben eines Programms die Annotation@NotNull und @Nullable

, um zu definieren, ob dies möglich ist sei ein Nullzeiger. Deklarieren Sie, ob eine Methode nullzeigersicher ist, indem Sie Annotationen wie @NotNull und @Nullable verwenden. Moderne Compiler, IDEs oder Tools können diese Annotation lesen und Ihnen dabei helfen, Nullzeigerprüfungen hinzuzufügen, die Sie vergessen haben, oder Sie zu unnötigen Nullzeigerprüfungen auffordern. IntelliJ und findbugs unterstützen diese Anmerkungen bereits. Diese Annotationen sind ebenfalls Teil von JSR 305, aber selbst wenn sie nicht in der IDE oder im Tool enthalten sind, kann die Annotation selbst als Dokumentation verwendet werden. Wenn der Programmierer @NotNull und @Nullable sieht, kann er entscheiden, ob er eine Nullzeigerprüfung durchführen möchte. Diese Technik ist übrigens für Java-Programmierer relativ neu und es wird eine Weile dauern, bis sie sich durchsetzt.

6) Vermeiden Sie unnötiges automatisches Umbrechen und automatisches Entpacken in Ihrem Code.

Unabhängig von anderen Mängeln wie der Erstellung temporärer Objekte kann das automatische Umschließen auch leicht zu einer Nullzeigerausnahme führen, wenn das Wrapper-Klassenobjekt null ist. Wenn das Personenobjekt beispielsweise keine Telefonnummer hat, wird null zurückgegeben und der folgende Code stürzt aufgrund einer Nullzeigerausnahme ab.


Person ram = new Person("ram");
int phone = ram.getPhone();

当使用自动包装和自动解包的时候,不仅仅是等号,6d267e5fab17ea8bc578f9e7e5e1570b 同样会抛出空指针异常。你可以通过这篇文章来学习更多的Java中的自动包装和拆包的陷阱。

7) 遵从Contract并定义合理的默认值。

在Java中避免空指针异常的一个最好的方法是简单的定义contract并遵从它们。大部分空指针异常的出现是因为使用不完整的信息创建对象或者未提供所有的依赖项。如果你不允许创建不完整的对象并优雅地拒绝这些请求,你可以在接下来的工作者预防大量的空指针异常。类似的,如果对象允许创建,你需要给他们定义一个合理的默认值。例如一个Employee对象不能在创建的时候没有id和name,但是是否有电话号码是可选的。现在如果Employee没有电话号码,你可以返回一个默认值(例如0)来代替返回null。但是必须谨慎选择,哟有时候检查空指针比调用无效号码要方便。同样的,通过定义什么可以是null,什么不能为null,调用者可以作出明智的决定。failing fast或接受null同样是一个你需要进行选择并贯彻的,重要的设计决策

8)定义数据库中的字段是否可为空。

如果你在使用数据库来保存你的域名对象,如Customers,Orders 等,你需要在数据库本身定义是否为空的约束。因为数据库会从很多代码中获取数据,数据库中有是否为空的检查可以确保你的数据健全。在数据空中维护null约束同样可以帮助你减少Java代码中的空指针检查。当从数据库中加载一个对象是你会明确,哪些字段是可以为null的,而哪些不能,这可以使你代码中不必要的!= null检查最少化。

9) 使用空对象模式(Null Object Pattern)

还有一种方法来避免Java中的空指针异常。如果一个方法返回对象,在调用者中执行一些操作,例如Collection.iterator()方法返回迭代器,其调用者执行遍历。假设如果一个调用者并没有任何迭代器,其可以返回空对象(Null object)而非null。空对象是一个特殊的对象,其在不同的上下文中有不同的意义。例如一个空的迭代器调用hasNext()返回false时,可以是一个空对象。同样的在返回Container和Collection类型方法的例子中,空对象可以被用来代替null作为返回值。我打算另写一篇文章来讲空对象模式,分享几个Java空对象的例子。

这就是全部了,这是几个易于遵从的避免空指针异常的Java技巧和最佳实践。你可以欣赏到这些技巧将非常有用,且不太难实现。如果你有其他比秒这个异常的技巧,而又没包含在这里,请通过评论来和我们分享,我将收录在这里。

Das obige ist der detaillierte Inhalt vonSo vermeiden Sie NullPointerException in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn