IllegalArgumentException oder NullPointerException für einen Nullparameter?

1. Einleitung

Bei den Entscheidungen, die wir beim Schreiben unserer Anwendungen treffen, geht es bei vielen darum, wann Ausnahmen und welcher Typ ausgelöst werden sollen.

In diesem kurzen Tutorial, werden wir die Frage, welche Ausnahme angehen zu werfen , wenn jemand einen übergibt null Parameter zu einem unseren Methoden: Illegal oder Nullpointer .

Wir werden das Thema untersuchen, indem wir die Argumente für beide Seiten untersuchen.

2. IllegalArgumentException

Schauen wir uns zunächst die Argumente für das Auslösen einer IllegalArgumentException an .

Erstellen wir eine einfache Methode, die eine IllegalArgumentException auslöst, wenn eine Null übergeben wird :

public void processSomethingNotNull(Object myParameter) { if (myParameter == null) { throw new IllegalArgumentException("Parameter 'myParameter' cannot be null"); } }

Kommen wir nun zu den Argumenten für IllegalArgumentException .

2.1. So sagt der Javadoc, es zu benutzen

Wenn wir das Javadoc für IllegalArgumentException lesen , heißt es , dass es verwendet werden soll, wenn ein unzulässiger oder unangemessener Wert an eine Methode übergeben wird . Wir können ein Null- Objekt als illegal oder unangemessen betrachten, wenn unsere Methode es nicht erwartet, und dies wäre eine angemessene Ausnahme für uns.

2.2. Es entspricht den Erwartungen der Entwickler

Lassen Sie uns als nächstes darüber nachdenken, wie wir als Entwickler denken, wenn wir Stapelspuren in unseren Anwendungen sehen. Ein sehr häufiges Szenario, in dem wir eine NullPointerException erhalten, ist, wenn wir versehentlich versucht haben, auf ein Null- Objekt zuzugreifen . In diesem Fall gehen wir so tief wie möglich in den Stapel, um zu sehen, auf was wir verweisen, das null ist .

Wenn wir eine IllegalArgumentException erhalten , gehen wir wahrscheinlich davon aus, dass wir etwas Falsches an eine Methode übergeben. In diesem Fall suchen wir im Stapel nach der untersten Methode, die wir aufrufen, und beginnen von dort aus mit dem Debuggen. Wenn wir diese Denkweise berücksichtigen, bringt uns die IllegalArgumentException näher an den Punkt , an dem der Fehler gemacht wird.

2.3. Andere Argumente

Bevor wir uns den Argumenten für NullPointerException zuwenden , schauen wir uns einige kleinere Punkte zugunsten von IllegalArgumentException an . Einige Entwickler sind der Meinung, dass nur das JDK NullPointerException auslösen sollte . Wie wir im nächsten Abschnitt sehen werden, unterstützt der Javadoc diese Theorie nicht. Ein weiteres Argument ist, dass die Verwendung von IllegalArgumentException konsistenter ist, da dies für andere unzulässige Parameterwerte verwendet wird.

3. NullPointerException

Als nächstes betrachten wir die Argumente für NullPointerException .

Erstellen wir ein Beispiel, das eine NullPointerException auslöst :

public void processSomethingElseNotNull(Object myParameter) { if (myParameter == null) { throw new NullPointerException("Parameter 'myParameter' cannot be null"); } }

3.1. So sagt der Javadoc, es zu benutzen

Gemäß der Javadoc for NullPointerException soll NullPointerException verwendet werden, um zu versuchen, null zu verwenden, wenn ein Objekt erforderlich ist . Wenn unser Methodenparameter nicht null sein soll , können wir dies vernünftigerweise als ein erforderliches Objekt betrachten und die NullPointerException auslösen .

3.2. Es stimmt mit JDK-APIs überein

Nehmen wir uns einen Moment Zeit, um über viele der gängigen JDK-Methoden nachzudenken, die wir während der Entwicklung aufrufen. Viele von ihnen lösen eine NullPointerException aus, wenn wir eine Null angeben . Zusätzlich löst Objects.requireNonNull () eine NullPointerException aus, wenn wir null übergeben. Laut der Objects- Dokumentation dient es hauptsächlich zur Validierung von Parametern.

Zusätzlich zu JDK-Methoden, die NullPointerException auslösen , finden Sie in der Collections-API weitere Beispiele für bestimmte Ausnahmetypen, die von Methoden ausgelöst werden. ArrayList.addAll (Index, Sammlung) löst eine IndexOutOfBoundsException aus, wenn der Index außerhalb der Listengröße liegt, und eine NullPointerException, wenn die Sammlung null ist . Dies sind zwei sehr spezifische Ausnahmetypen und nicht die allgemeinere IllegalArgumentException .

Wir könnten IllegalArgumentException als für Fälle gedacht betrachten , in denen uns kein spezifischerer Ausnahmetyp zur Verfügung steht.

4. Fazit

Wie wir in diesem Tutorial gesehen haben, ist dies eine Frage, die keine klare Antwort hat. Die Dokumentation für die beiden Ausnahmen scheint sich dahingehend zu überschneiden, dass beide für sich genommen angemessen klingen. Es gibt auch zusätzliche überzeugende Argumente für beide Seiten, basierend darauf, wie Entwickler ihr Debugging durchführen und welche Muster in den JDK-Methoden selbst zu sehen sind.

Unabhängig davon, welche Ausnahme wir gewählt haben, sollten wir in unserer gesamten Anwendung konsistent sein. Darüber hinaus können wir unsere Ausnahmen nützlicher machen, indem wir dem Ausnahmekonstruktor aussagekräftige Informationen bereitstellen. Zum Beispiel sind unsere Anwendungen einfacher zu debuggen, wenn wir den Parameternamen in der Ausnahmemeldung angeben.

Wie immer ist der Beispielcode auf GitHub verfügbar.