Functionsparameter prüfen und eine Exception werfen !?

Hallo zusammen ich habe mal eine generelle Frage :
Ich schreibe ein größere Anwendung und bin dabei in allen öffentlichen und teils auch in den privaten Methoden eine Parameterprüfung zu entwicklen.
Das sieht dann so aus

Java:
    // throw an exception if the text is empty or null
     if (url == null || url.isEmpty()) {
       throw new WebContentReaderException("can't parse the text, because the text parameter is empty or null");
     }

     // throw an exception if the patternList is null or empty
     if (patternList == null || patternList.isEmpty()) {
       throw new WebContentReaderException("can't parse the text, because the text parameter is empty or null");
     }

     // throw an exception if the matcherGroupIndex < 0
     if (matcherGroupIndex < 0) {
       throw new WebContentReaderException("can't parse the text, because the text parameter is empty or null");
     }


Da ich für jede Funktion auch einen Unit Test schreibe, bläht es den Code enorm auf. nun meine Frage ist es überhaupt sinnvoll, jeden Parameter gegen einen Null - Check zu prüfen oder einfach dann mit einem default wert weitermachen - wenn es sinnvoll ist?

Vielen Dank für eure Hilfe
 
Zuletzt bearbeitet von einem Moderator:

thecain

Top Contributor
Wenn es sinnvoll ist spricht nichts dagegen, aber einen Test müsstest du dann ja trotzdem schreiben ;) Was aber nicht schlimm ist
 
Danke für deine schnelle Antwort. Ich habe eine Klasse mit einigen Funktionen und in jeder prüfe ich ob der String nicht null oder leer ist. Und mit den anderen PArameter ähnlich. Das ist dass was ich meine, das es dann eher unleserlich wird, da der Code so lang ist.

Wie macht ihr das
 

mrBrown

Super-Moderator
Mitarbeiter
Ich nutz aktuell dafür Springs Assert-Klasse, sowas lässt sich auch leicht selbst schreiben.
Im Prinzip also Auslagern der if's in eine Methoden, macht den Code kompakter, leserlicher und mMn auch Fehlerunanfälliger.
In deinem Fall gäb's dann eine Assert.notEmpty(String string), dir für null oder leeren String die WebContentReaderException schmeißen würde, und im Code stand dann nur noch Assert.notEmpty(url), statt dem if-Block.
Bei vielen checks nacheinander könnte man es auch so schreiben, dass man 'n Array aller Argumente übergibt, dann hätte man nur noch eine Zeile Assert.notEmpty(url,patternList).
Für den Check <0 dann sowas wie Assert.greaterThan(matcherGroupIndex,0) oder Assert.greaterThan0(matcherGroupIndex).

Die UnitTest sind davon ja nicht betroffen, da sollte man ja sowieso jeden Case abdecken. Ob man dann testet ob das ein valides Ergebnis ist, wenn man Defaultwerte nutzt, oder auf die Exception prüft, macht ja keinen großen Unterschied.
 
K

kneitzel

Gast
Also Parameter, die vom Design her gesetzt werden müssen werden geprüft und es wird eine Exception geworfen. Das ist aus meinen Augen sehe wichtig und wird bei unseren code analysis Tool auch geprüft. Ein Argument ist einfach schon, dass Du den Fehler direkt an der Stelle aufzeigen willst, an der er bekannt wird.

Wenn es sinnvolle defaultwerte gibt, dann werden die natürlich verwendet aber oft gibt es die eben nicht.
 

Thallius

Top Contributor
Naja,

Ich würde da ml strickt trennen ob eine Methode eine Art API darstellt oder ob sie nur intern in diesem einen Project benutzt wird. Im ersten Fall sollte die Exception natürlich behandelt werden. Im zweiten Fall kann man theoretisch einen knallharten System.out.print machen und danach einen System.Exit(-1)
Denn ein Fehlerhafter Aufruf einer Methode kann nur durch einen fehlerhaften aufrufenden Code erzeugt werden. Und da ist es am einfachsten wenn man währende der Entwicklung direkt einen Cut macht und sieht wo es gekracht hat, als wenn man da irgendwelche Excpetions nach oben durchreicht.

Gruß

Claus
 

mrBrown

Super-Moderator
Mitarbeiter
Naja,
Ich würde da ml strickt trennen ob eine Methode eine Art API darstellt oder ob sie nur intern in diesem einen Project benutzt wird. Im ersten Fall sollte die Exception natürlich behandelt werden. Im zweiten Fall kann man theoretisch einen knallharten System.out.print machen und danach einen System.Exit(-1)
Denn ein Fehlerhafter Aufruf einer Methode kann nur durch einen fehlerhaften aufrufenden Code erzeugt werden. Und da ist es am einfachsten wenn man währende der Entwicklung direkt einen Cut macht und sieht wo es gekracht hat, als wenn man da irgendwelche Excpetions nach oben durchreicht.

Solange man 'ne Unchecked Exception wirft, wird die im Normalfall nicht gefangen, falls man die wahllos fängt, liegt das Problem eher an anderer Stelle...
Zusätzlich zum Beenden hat man mit Exceptions auch noch 'nen Aussagekräftigen Stacktrace.

Wenn man nur System.Exit(-1) macht, hat man nur Ausgabe vom serr, aber darin auch keine Angabe woher der Aufruf kam. Außerdem macht man damit erstmal den Code untestbar, weil die ganze JVM beendet wird.
 

thecain

Top Contributor
Ich stelle mir immer die Frage, warum kann der Wert null sein. null ist meiner Erfahrung nach zu 90% schlechtes Design. Wenn es sich im aktuellen Projektstand noch vermeiden lässt, würde ich da ansetzen, heisst, warum gibt es die Möglichkeit, dass null übergeben wird.

Ist es wirklich ein möglich, dass null übergeben wird, muss man darauf prüfen und die entsprechenden Exceptions werfen. Ob checked oder unchecked ist ein Diskussionspunkt und kommt auf die Umstände an, die ich hier nicht beurteilen kann. Wie man diese Checks dann macht ist grundsätzlich egal. Wichtig ist, dass es gut lesbar ist. Eine Methode wie validateXyz() welche die Prüfungen macht wäre etwa mein Ansatz.
 
K

kneitzel

Gast
Das Problem ist ja doch gerade, dass das Design kein null vorsieht, aber da eine Referenz benötigt wird bietet Java nun einmal auch null an.

Und das Validieren in eine eigene Funktion zu packen halte ich für ungeeignet. Das ist ja nur ein if ... throw new ...

Und da es ein Entwicklerfehler ist, ist es Unsinn, da eine checked Exception zu nehmen. Ich fange doch nicht ab, dass ich zu blöd war selbst zu sehen, dass ein Wert null sein konnte. Da prüfe ich doch lieber selbst auf null.

Aber das ist nur meine Sicht. Kann natürlich jeder selbst so machen wie er will.
 

thecain

Top Contributor
Das Problem ist ja doch gerade, dass das Design kein null vorsieht, aber da eine Referenz benötigt wird bietet Java nun einmal auch null an.
Wenn ich eine API habe, dann biete ich möglichst keine Methode an, welche null erlaubt. Dafür kann ich Methoden ja überladen. Wenn dann jemand falsch aufruft ist es auch OK, wenn es knallt. Intern kann ich dann immer noch mit einem Optional arbeiten, wenn ich das will.

Und das Validieren in eine eigene Funktion zu packen halte ich für ungeeignet. Das ist ja nur ein if ... throw new ...
Zugegeben eigene Präferenzen hier. In der Hoffnung das diese 3 Parameter aus dem selben Objekt könnten (oder auch einzeln) hätte ich alle 3 oder mehr in einer Methode geprüft um die tatsächliche Logik nicht vollzumüllen.

Und da es ein Entwicklerfehler ist, ist es Unsinn, da eine checked Exception zu nehmen. Ich fange doch nicht ab, dass ich zu blöd war selbst zu sehen, dass ein Wert null sein konnte. Da prüfe ich doch lieber selbst auf null.
Wenn ich es beeinflussen kann (Codingfehler), dann stimm ich dir zu. Wenn ich Beispielsweise ein File lese, welches mir ein User zur Verfügung stellt, sieht es anders aus. Wobei ich auch zugeben muss, dass ich immer mehr ein Fan davon werde alle Exceptions unchecked zu haben, wie es in anderen Sprachen bereits üblich ist.
 
K

kneitzel

Gast
Wie erlaubst du kein null? Setzt du ein Contract Framework ein, so dass Du dies vorgeben kannst? An der Stelle habe ich im Augenblick Probleme, Deine Aussage richtig zu verstehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
OnDemand Prüfen ob Bild defekt ist Allgemeine Java-Themen 4
N Prüfen, ob ein String 2x das selbe Zeichen hat Allgemeine Java-Themen 10
W Classpath Reflexion - Prüfen ob man auf ein Feld ändern kann Allgemeine Java-Themen 2
OnDemand Bild prüfen ob defekt Allgemeine Java-Themen 3
B Java Mail: Prüfen, ob Email hat ein Anhang oder nicht Allgemeine Java-Themen 2
Bluedaishi Prüfen ob Datei noch geöffnet ist Allgemeine Java-Themen 59
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
J Mit Lombok Integer Range prüfen Allgemeine Java-Themen 6
S Prüfen ob Textfile existiert Allgemeine Java-Themen 9
E Programm auf Installation prüfen Allgemeine Java-Themen 1
S Binärbaum prüfen Allgemeine Java-Themen 0
L String auf zahlenwert prüfen Allgemeine Java-Themen 13
W Datum prüfen + zweistellig Allgemeine Java-Themen 11
Z Java Exceptions - Auf leeres Feld prüfen Allgemeine Java-Themen 10
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
P Prüfen ob es Variable mit Namen gibt der als String übergeben wird Allgemeine Java-Themen 7
M .jar nach Datei prüfen Allgemeine Java-Themen 2
B Existenz eines Files max 30 sec prüfen Allgemeine Java-Themen 5
B Prüfen, ob ein Element in der Liste nicht existiert Allgemeine Java-Themen 3
F Cardlayout prüfen ob schon vorhanden, keine doppelten Allgemeine Java-Themen 3
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
S Lambda Ausdrücke: @FunctionalInterface Instanzen auf null prüfen Allgemeine Java-Themen 9
D ArrayList index auf gültigkeit prüfen Allgemeine Java-Themen 12
C Best Practice [Arrays] Wie sinnvoll prüfen, ob Array primitive Datentypen enthält? Allgemeine Java-Themen 6
L Prüfen, ob Programm über 32bit oder 64bit Java ausgeführt wird Allgemeine Java-Themen 4
K Methoden Arrays auf true Werte prüfen Allgemeine Java-Themen 4
Y Prüfen ob ein Graph immer einen von mehren Enden erreicht Allgemeine Java-Themen 4
O Prüfen ob String eine Zahl mit maximal 2 Nachkommastellen ist Allgemeine Java-Themen 4
M datei aufruf prüfen Allgemeine Java-Themen 9
D Best Practice Prüfen ob jar nachträglich geändert wurde Allgemeine Java-Themen 2
B Dateien prüfen auf Gleichheit Allgemeine Java-Themen 5
H String auf Zahlen prüfen Allgemeine Java-Themen 4
T auf Valides Datum prüfen Allgemeine Java-Themen 12
N Java Version Prüfen lassen Allgemeine Java-Themen 11
S Variablen Prüfen ob Number vom Typ Integer, Float, Double, ... ist Allgemeine Java-Themen 2
E selber Klassen kompilieren/ prüfen Allgemeine Java-Themen 5
O Variablen Originalname einer übergebenen Variable prüfen Allgemeine Java-Themen 9
T Methoden Zahlenpalindrom laufzeitoptimiert prüfen Allgemeine Java-Themen 4
U ResourceBundles auf vollständigkeit prüfen Allgemeine Java-Themen 2
C jollyday: prüfen, ob Datum = Feiertag Allgemeine Java-Themen 8
C Prüfen ob sich ein Punkt innerhalb einer Kugel befindet (Java3D,nicht-lineare GLS) Allgemeine Java-Themen 5
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
E Prüfen ob Fenster mit Namen offen ist Allgemeine Java-Themen 2
M Binärbaum auf vollständigkeit prüfen Allgemeine Java-Themen 4
S Mail Adressen Syntax prüfen Allgemeine Java-Themen 22
O Text mit Wildcard gegen regulären Ausdruck prüfen Allgemeine Java-Themen 3
N List auf null prüfen Allgemeine Java-Themen 2
B generischen Typ prüfen Allgemeine Java-Themen 7
D prüfen, ob Enums bestimmte Elemente enthalten Allgemeine Java-Themen 3
N Prüfen ob Methode ausgeführt wird und diese ggf. abbrechen? Allgemeine Java-Themen 8
B Prüfen ob ein Programm gestartet wurde Allgemeine Java-Themen 23
N ArrayList nach Reihenfolge prüfen Allgemeine Java-Themen 2
C Prüfen auf Zahl und 6 stellig fehlerhaft? warum? Allgemeine Java-Themen 7
D Wie prüfen, ob ein String Teil eines Enum Types ist? Allgemeine Java-Themen 12
H Prüfen, ob doppete Werte in int-Array vorhanden sind Allgemeine Java-Themen 16
data89 Bilder mit Java prüfen - suche dringend Hilfe Allgemeine Java-Themen 8
S Prüfen auf Hex-Wert fester Länge! Allgemeine Java-Themen 5
M Prüfen, welche anderen Programme laufen Allgemeine Java-Themen 5
K Zip dateien prüfen Allgemeine Java-Themen 3
G ZIP Archiv auf Konsistenz prüfen Allgemeine Java-Themen 2
T Parameter einer Klasse auf Interface prüfen Allgemeine Java-Themen 6
L Passwort mit Regulärem Ausdruck prüfen Allgemeine Java-Themen 6
P Sound Buffer prüfen Allgemeine Java-Themen 12
B PrintService - Wie prüfen ob Drucker online ist? Allgemeine Java-Themen 2
A Textfeld prüfen, ob ein Punkt eingegeben wurde Allgemeine Java-Themen 8
flashfactor Prüfen ob bereits eine Instanz gestartet ist Allgemeine Java-Themen 2
C Prüfen, ob eine Methode eine andere überschreibt! WIE? Allgemeine Java-Themen 8
T Prüfen, ob Char ein Quantifier ist Allgemeine Java-Themen 6
N Prüfen ob Objekt in Liste enthalten ist Allgemeine Java-Themen 17
G Prüfen welche JRE-Version gebraucht wird Allgemeine Java-Themen 19
J Mit Patternmatching einen Satz prüfen Allgemeine Java-Themen 12
G Prüfen ob Ziffern einer Zahl pandigital sind? Allgemeine Java-Themen 15
M Prüfen ob Variable vorhanden / initalisiert ist Allgemeine Java-Themen 4
J Wie prüfen ob eine Datei vom OS fertig geschrieben wurde? Allgemeine Java-Themen 6
TheJavaKid Zeile auf existenz von String prüfen. Allgemeine Java-Themen 19
A Weshalb man Parameter auf Gültigkeit prüfen sollte Allgemeine Java-Themen 6
N Prüfen ob ein String in einen Integer umgewandelt werden kan Allgemeine Java-Themen 4
O String auf zahlen prüfen (java 1.3) Allgemeine Java-Themen 4
G Datei Zugriffsrechte prüfen Allgemeine Java-Themen 2
Linad Bilder auf Gleichheit prüfen Allgemeine Java-Themen 6
G ResultSet auf Inhalt prüfen? Allgemeine Java-Themen 2
H Prüfen, ob es sich um ein Integer handelt Allgemeine Java-Themen 4
C String str prüfen Allgemeine Java-Themen 3
H Prüfen ob ein String grösser als 4 Zeichen ist Allgemeine Java-Themen 3
F Prüfen, ob Windows oder UNIX Allgemeine Java-Themen 2
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
B Wie erstelle ich dazu eine Abfrage ob der Button gedrückt wurde? Allgemeine Java-Themen 8
J Integration pay Pale in eine JavaFx Desktop Application Allgemeine Java-Themen 1
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
8u3631984 Strukturiertes Logging : Jedes Feld in eine seperate Zeile - aber wie ? Allgemeine Java-Themen 2
berserkerdq2 Gibt es eine saubere Dokumentation von Jfoenix? Allgemeine Java-Themen 1
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
T Eine Frage des Designs Allgemeine Java-Themen 2
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
H Eine Linie verkürzen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben