Weshalb man Parameter auf Gültigkeit prüfen sollte

In seinem Weblog verrät uns hoskinator heute, warum man Parameter auf Gültigkeit überprüfen sollte. Ich spiele den Ball mal einfach weiter, für uns Deutsch-Sprecher ;)

Josh Bloch führt in seinem Buch „Effective Java“ diesen Tipp unter der Nummer 23. Man sollte sich mal die Mühe machen durchzugehen, warum man es tun sollte, ob man es wirklich tun sollte und welche Konsequenzen sich daraus ergeben.

Man kann beispielsweise argumentieren, dass der Aufrufer sicherzustellen hat, zulässige Paramterwerte zu übergeben. Was zulässig ist und was nicht, ist dabei per JavaDoc zu dokumentieren. Mit diesem Wissen ausgestattet können wir uns zurücklehnen und sagen „Wer sich nicht dran hält, ist selber schuld.“.

Stellt sich die Frage, ob man es sich wirklich so einfach machen sollte, die Verantwortung für die korrekte Funktion des eigenen Codes an andere abzuschieben. Zumal es ja auch sein kann, dass man selbst bei der Benutzung der eigenen Methoden Fehler einbaut.

Generell sollten Fehler bei der Programmausführung so früh als möglich als solche in Erscheinung treten (fail-fast), so dass sie nicht zu Folgefehlern führen, die evtl. noch schwerwiegender sind. Dies vereinfacht auch das Debugging, da die Fehlerkette kürzer ist, an der entlang man sich zur Ursache hangelt. Die Idee hinter dem Ganzen wurde mir schnell klar. Bewusst oder unbewusst bin ich vor einiger Zeit schon dazu übergegangen Parameter zu checken, auch wenn ich das vermutlich nicht immer und an jeder Stelle tue (Ich gelobe Besserung!). Besonders in meinem ab und an zu schreibenden PHP-Code checke ich recht viel, da diesen lose typisierenden Skriptsprachen nicht so recht zu trauen ist.

Bisher habe ich es so gehandhabt, dass ich fehlerhafte Parameter lediglich protokolliert und die Methode daraufhin mit einem „return“ oder „return null“ beendet habe. Allerdings interessierte mich, wie andere dies handhaben und mit welcher Begründung. So wurde ich auf einen weiteren Blog-Eintrag aufmerksam gemacht und musste feststellen, dass ich bisher nur sehr selten selbstständig Exceptions geworfen habe.
Stattdessen habe ich festgelegt, dass im Falle eines Fehlers eine Methode „null“ zurückliefert. Das krabbelt dann die Nahrungskette soweit nach oben, bis schlussendlich doch irgendwo eine Exception herauskommt, oder ein nicht gewünschtes Verhalten auftritt.

Daher werde ich wohl demnächst mit meinen neuen Freunden einen trinken gehen, die da heißen NullPointerException, IllegalArgumentException und IndexOutOfBoundsException. Auf eine gute Freundschaft, Prost!

Links: