Ich habe eine einfache Setter-Methode für eine Eigenschaft und null
ist für diese spezielle Immobilie nicht geeignet. Ich war in dieser Situation immer hin- und hergerissen: Sollte ich eine IllegalArgumentException
oder eine NullPointerException
? Nach den Javadocs scheinen beide geeignet zu sein. Gibt es so etwas wie einen anerkannten Standard? Oder ist das einfach so, dass man das tun sollte, was man bevorzugt, und beides ist wirklich richtig?
Antworten
Zu viele Anzeigen?Sie sollten eine IllegalArgumentException auslösen, da dies dem Programmierer deutlich macht, dass er etwas Ungültiges getan hat. Entwickler sind so sehr daran gewöhnt, dass die VM eine NPE auslöst, dass ein Programmierer seinen Fehler nicht sofort erkennt und sich wahllos umschaut oder, schlimmer noch, Ihrem Code die Schuld gibt, dass er "fehlerhaft" ist.
In diesem Fall vermittelt IllegalArgumentException dem Benutzer, der Ihre API verwendet, die eindeutige Information, dass das " nicht null sein sollte". Wie von anderen Forumsnutzern erwähnt, können Sie NPE verwenden, solange Sie dem Nutzer Ihrer API die richtigen Informationen vermitteln.
GaryF und tweakt haben "Effective Java" (auf das ich schwöre) weggelassen, das die Verwendung von NPE empfiehlt. Und wenn man sich anschaut, wie andere gute APIs aufgebaut sind, ist das der beste Weg, um zu sehen, wie man seine API aufbaut.
Ein weiteres gutes Beispiel sind die Spring-APIs. Zum Beispiel hat org.springframework.beans.BeanUtils.instantiateClass(Constructor ctor, Object[] args) eine Assert.notNull(ctor, "Constructor must not be null") Zeile. org.springframework.util.Assert. notNull(Object object, String message) prüft, ob das übergebene Argument (object) null ist, und wenn ja, wirft es eine neue IllegalArgumentException(message), die dann in der Methode org.springframework.beans.BeanUtils.instantiateClass(...) abgefangen wird.
Wenn es ein "Setter" ist, oder irgendwo ich bin immer ein Mitglied später zu verwenden, neige ich zu IllegalArgumentException verwenden.
Wenn es sich um etwas handelt, das ich jetzt in der Methode verwenden werde (Dereferenzierung), werfe ich proaktiv eine NullPointerException. Ich mag dies besser als die Laufzeit zu tun, weil ich eine hilfreiche Nachricht bereitstellen kann (scheint wie die Laufzeit könnte dies auch tun, aber das ist ein Tadel für einen anderen Tag).
Wenn ich eine Methode überschreibe, verwende ich das, was die überschriebene Methode verwendet.
Die Definitionen aus den Links zu den beiden Ausnahmen oben lauten IllegalArgumentException: Wird ausgelöst, um anzuzeigen, dass einer Methode ein unzulässiges oder ungeeignetes Argument übergeben wurde. NullPointerException: Wird ausgelöst, wenn eine Anwendung versucht, null in einem Fall zu verwenden, in dem ein Objekt erforderlich ist.
Der große Unterschied besteht darin, dass die IllegalArgumentException verwendet werden soll, wenn geprüft werden soll, ob ein Argument für eine Methode gültig ist. NullPointerException soll immer dann verwendet werden, wenn ein Objekt "benutzt" wird, obwohl es null ist.
Ich hoffe, das hilft, die beiden in die richtige Perspektive zu rücken.
Im Idealfall sollten keine Laufzeitausnahmen ausgelöst werden. Für Ihr Szenario sollte eine geprüfte Ausnahme (Business Exception) erstellt werden. Denn wenn eine dieser Ausnahmen ausgelöst und protokolliert wird, führt dies den Entwickler beim Durchgehen der Protokolle in die Irre. Stattdessen verursachen Geschäftsausnahmen keine Panik und werden bei der Fehlersuche in den Protokollen normalerweise ignoriert.