Weshalb man Parameter auf Gültigkeit prüfen sollte

Status
Nicht offen für weitere Antworten.

AlArenal

Top Contributor
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 übergegenagen 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 festgeelgt, dass im Falle eines Fehlers eine Methode "null" zurückliefert. Das krabllet 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:
- Why you should check method parameters for validity
- Where should you check for NullPointerExceptions
 

foobar

Top Contributor
Stattdessen habe ich festgeelgt, dass im Falle eines Fehlers eine Methode "null" zurückliefert. Das krabllet dann die Nahrungskette soweit nach oben, bis schlussendlich doch irgendwo eine Exception herauskommt, oder ein nicht gewünschtes Verhalten auftritt.
Das versuche ich zu vermeiden.

Ich prüfe Parameter in kritischen methoden oft auf Gültigkeit und werfe dann IllegalArgument oder IllegalStateExceptions mit aussagekräftigen Fehlermeldungen.
In einer Methode prüfe ich z.b. ob der übergeben in einem Range zwischen 0 und 255 liegt und werfe ansonsten eine IllegalargumentException mit dem Hinweise, daß nur 0-255 erlaubt ist. Das macht das Leben etwas eträglicher, weil man sofort sieht wo der Fehler liegt :)

Viele Grüße
foobar
 

foobar

Top Contributor
AlArenal hat gesagt.:
Ich warte nur noch auf nen C-Gast, der nun wieder meckert wegen der Performance.. ;)

*ggg* Tja, auch Software unterliegt dem Gesetz der Polarität. Jede Entscheidung hat ihre Vor- und Nachteile.

BTW Ich halte Performanceoptimierungen wie Getter und Setter durch direkten Zugriff auf die Member zu ersetzen für Unsinn. Bei welchen Anwendungen soll man denn da einen Unterschied feststellen?
 

Kola

Aktives Mitglied
Ja, das mit den Exceptions sollte man konsequent durchziehen. Wenn man das weiterdenkt, dann sollte mir Eclipse eigentlich für eine nicht-implementierte Methode keinen Returnwert angeben, sondern eine RuntimeException werfen.
Beispiel (für eine void-Funktion. Für den Returnwerttyp "Object" würde Eclipse "return null;" generieren):
Code:
	public void initializeRelationships() {
		// TODO Auto-generated method stub

	}
würde dann zu:
Code:
	public void initializeRelationships() {
		// TODO Auto-generated method stub
                                throw new RuntimeException("not implemented");
	}
 

AlArenal

Top Contributor
@foobar:
Ich halte es mit dem Grundsatz, dass die einzigen public Variablen final sein müssen. Alles andere ist ein Albtraum, wenn man später was ändern muss. Eine interessante Frage ist auch, welchen Typ solche Konstanten haben sollten. Nehmen wir an du schreibst eine Lib und definierst öffentliche String-Konstanten. Änderst du diese nachträglich, musst du auch die Anwendungen, die die Lib verwenden neu kompilieren, was bei Objekt-Instanzen anstatt der Strings nicht der Fall wäre.

@kola:
Sind diese Methodenrümpfe nicht in Vorlagen defniniert, die man ändern kann? In Netbeans bin ich mir sehr sicher, dss es so ist. Hatte da neute noch so ein Template in den Fingern.
 

AlArenal

Top Contributor
AlArenal hat gesagt.:
@kola:
Sind diese Methodenrümpfe nicht in Vorlagen defniniert, die man ändern kann? In Netbeans bin ich mir sehr sicher, dss es so ist. Hatte da neute noch so ein Template in den Fingern.

Window -> Preferences -> Java -> Code Style -> Code Templates -> Method body
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 2
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 1
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
JavaJüngling beliebige Collection die Comperable Elemente enthält als Parameter Allgemeine Java-Themen 37
M Datensatz auf ein bestimmten Parameter einzugrenzen Allgemeine Java-Themen 11
B JAX - RS.... Multiple parameter application/x-www-form-urlencoded.... Allgemeine Java-Themen 6
B Parameter Konstruktor plus rechnen Allgemeine Java-Themen 6
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
W Haben Konstruktoren in Java eigentlich immer mindestens einen Parameter? Allgemeine Java-Themen 4
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
F URI mit Parameter klappt nicht Allgemeine Java-Themen 1
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
temi best practice: Parameter überprüfen, wo? Allgemeine Java-Themen 9
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
MiMa If-Abfrage mit Parameter Allgemeine Java-Themen 8
I Javaaufruf aus Batch inkl. Parameter (Adminrechte) Allgemeine Java-Themen 2
P Java https proxy (-Dhttps.proxyHost) Start-Parameter funktioniert nicht? Allgemeine Java-Themen 2
Neumi5694 Methoden Generic: Rückgabetyp als Class-Parameter übergeben Allgemeine Java-Themen 3
K Java FX Zu startenden FXML-Controller per Parameter wählen Allgemeine Java-Themen 2
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
T Klassen Parameter weitergabe Allgemeine Java-Themen 1
C Überschreiben mit kontravariante Parameter Allgemeine Java-Themen 13
M Parameter auslesen im Servlet Allgemeine Java-Themen 0
perlenfischer1984 Wann ist ein Parameter Check sinnvoll Allgemeine Java-Themen 7
Neumi5694 Vererbung Parameter muss 2 Bedingungen erfüllen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
T Parameter Allgemeine Java-Themen 6
R Parameter Adapter - Design Allgemeine Java-Themen 1
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
F In OSX: Java-Programm über URI-Scheme aufrufen mit Parameter? Allgemeine Java-Themen 0
H Generics als Parameter Allgemeine Java-Themen 1
N [stream-api] Parameter pro Typ zählen Allgemeine Java-Themen 1
OnDemand Maximale Parameter Allgemeine Java-Themen 5
M final vor dem parameter eines Konstruktors Allgemeine Java-Themen 1
S Servlet, per URLConnection Mit String Http Parameter mitsenden Allgemeine Java-Themen 3
M Parameter-Datei einlesen (zeilenweise); Dateiintegrität Allgemeine Java-Themen 7
H JasperReport: Parameter befüllen Allgemeine Java-Themen 7
Joew0815 JList + JTableModel: Parameter der Tabelle übergeben Allgemeine Java-Themen 10
Y Applet/Html - Wie Java-Methode aufrufen, die einen Parameter erwartet? Allgemeine Java-Themen 3
G Polymorphie Funktion als Parameter Allgemeine Java-Themen 8
G Methoden Unterschiedliche viele Parameter Allgemeine Java-Themen 17
F Parameter im Link /jar-Aufruf Allgemeine Java-Themen 12
S OOP Designrichtlinie Parameter Prüfung Allgemeine Java-Themen 7
C char und char-Array als parameter übergeben Allgemeine Java-Themen 6
B Array Parameter Problem Allgemeine Java-Themen 3
C Reflektions, Benutzer soll Konstruktor auswählen und Parameter übergeben können Allgemeine Java-Themen 5
S Keytool: mögliche Werte für Parameter Allgemeine Java-Themen 4
H Externes Programm, Parameter Allgemeine Java-Themen 6
C Webservice: XML Parameter übergabe. Allgemeine Java-Themen 7
M Session-Parameter setzen? Allgemeine Java-Themen 10
P VM-Parameter -D... Allgemeine Java-Themen 3
V Wildcard aus Parameter in return type Allgemeine Java-Themen 2
O Collections Eigene Methodenzusicherung bei Collections als Parameter Allgemeine Java-Themen 2
W ScriptEngine + Wie Parameter übergeben bei Fukntion? Allgemeine Java-Themen 2
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
F Parameter für Java Applikation per xml ins Meta-inf speichern? Allgemeine Java-Themen 3
J BlueJ Methode hat zu viele Parameter Allgemeine Java-Themen 6
R VM-Error - BadWindow (invalid Window parameter) Allgemeine Java-Themen 4
J Parameter an Java übergeben Allgemeine Java-Themen 10
S Neue Instanz eines Objekts erzeugen - Konstruktor erhaelt Parameter. Allgemeine Java-Themen 5
P VM Parameter und .jar Allgemeine Java-Themen 3
L Parameter-Objekte verändern oder nicht? Allgemeine Java-Themen 6
J Parameter absichtlich für außen verändern Allgemeine Java-Themen 4
A wie kann man Parameter an ein Task übergeben? Allgemeine Java-Themen 3
Iron Monkey Singleton mit Parameter Allgemeine Java-Themen 14
G setter und getter: Parameter Überprüfung Allgemeine Java-Themen 6
G JVM Parameter Allgemeine Java-Themen 7
G Parameter Bedeutung Allgemeine Java-Themen 4
W Properties-Klasse: mehrere Parameter-Belegungen übergeben? Allgemeine Java-Themen 2
J Unicode: cmd parameter (main args); exec params; filenames Allgemeine Java-Themen 2
C US_export_policy.jar und local_policy.jar VM Parameter Allgemeine Java-Themen 1
J Casten ueber generischen Parameter? Allgemeine Java-Themen 5
T Parameter einer Klasse auf Interface prüfen Allgemeine Java-Themen 6
G generische Klasse als Parameter einer generischen Klasse Allgemeine Java-Themen 5
G Parameter oder Attribut (wann nehme ich was?) Allgemeine Java-Themen 12
S .rar-Dateien ein Passwort als Parameter übergeben Allgemeine Java-Themen 5
N Funktion als Parameter einer anderen Funktion Allgemeine Java-Themen 5
D Parameter parsen? Allgemeine Java-Themen 15
G Typ Parameter & Reflections Allgemeine Java-Themen 4
F mehrere Verzeichnisse als Parameter Allgemeine Java-Themen 15
Y Javadoc - Wie Parameter ansprechen bei Methodenkommentar Allgemeine Java-Themen 2
G Parameter bei mailto Allgemeine Java-Themen 2
C Java Parameter zum starten ohne auf Programmende zu warten Allgemeine Java-Themen 4
V Jar Datei mit Parameter starten Allgemeine Java-Themen 7
P Übergabe- Parameter SQL Map Allgemeine Java-Themen 45
S URL-Parameter auslesen Allgemeine Java-Themen 2
F Parameter vs Argument Allgemeine Java-Themen 4
T xverify-parameter : Workaround zur Laufzeit? Allgemeine Java-Themen 8
F Viele generische Parameter sinnvoll? oder besser casten? Allgemeine Java-Themen 10
P command line parameter auswerten Allgemeine Java-Themen 3
M Parameter an main übergeben aber wie? Allgemeine Java-Themen 4
T Parameter an Thread übergeben Allgemeine Java-Themen 8
S synchronisation einer Methode abhängig vom Parameter Allgemeine Java-Themen 10
J Interface als Parameter übergeben Allgemeine Java-Themen 4
L JNI: C-->Java : Methode mit String-Parameter Allgemeine Java-Themen 18
H in JOE die Parameter -xmx256m -xrs hinzufügen Allgemeine Java-Themen 2
K Testen einer Klasse mit File Objekt als Parameter Allgemeine Java-Themen 6
X Default-Werte für Methoden-/Funktions-Parameter Allgemeine Java-Themen 2
M Funktion als Parameter oder andere Möglichkeit Allgemeine Java-Themen 3
R Parameter in einer Methode verändern Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben