Nein, für Argumentvalidierungen solltest du passende RuntimeExceptions werfen z.B. NPE oder IAE, und diese natürlich mit einer aussagekräftigen Message versehen, und nicht mit "data". Außerdem gibts für sowas schon fertige Libs z.B. Preconditions (Guava: Google Core Libraries for Java 19.0-SNAPSHOT API)
Exceptions darf man nur werfen, wenn ein Ausnahmefall eintritt. Das ist beim Ausfüllen von Formularen nicht gegeben. Es ist kein Ausnahmefall, wenn ein User ein Pflichtfeld nicht ausfüllt.
Meine Antwort bezog sich auf das Datenobjekt und die Argumentvalidierung innerhalb des Setters. Nicht auf irgendwelche Formular-Validierungen die obendrüber liegen.
Vielleicht auch mehr n philosophisches Problem:
Hier im Forum habe ich schon häufiger den Satz gelesen: "Exceptions sollten nicht der Programmsteuerung dienen."
Wäre zur Validierung da nicht z.B. ein boolscher Wert besser?
Sollten Exceptions nicht nur geworfen werden, wenn wirklich schwerwiegende Probleme (Daten nicht gefunden, Pfade falsch, Verbindung unterbrochen) auftreten? N negatives Alter z.B. ist zwar doof, würde ich aber nicht als schwerwiegendes Problem bezeichnen.
Wenn etwas passiert, was nicht passieren soll, obwohl man entsprechende Prüfmöglichkeiten anbietet, dann sollte meiner Meinung nach eine Exception geworfen werden. In der Raumfahrt könnte so ein Fehler fürchterliche Auswirkungen haben. Womöglich würde eine Raumsonde dann in die entgegengesetzte Richtung fliegen
Wenn etwas passiert, was nicht passieren soll, obwohl man entsprechende Prüfmöglichkeiten anbietet, dann sollte meiner Meinung nach eine Exception geworfen werden. In der Raumfahrt könnte so ein Fehler fürchterliche Auswirkungen haben. Womöglich würde eine Raumsonde dann in die entgegengesetzte Richtung fliegen
Na da ist es natürlich super wenn die Software der Raumsonde eine Exception wirft und mit einem stacktrace aussteigt.
Also eine dümmeres Beispiel gibt es wohl kaum.
Eine Exception sollte wirklich nur dann geworfen werden wenn es keine Möglichkeit gibt den Fehler abzufangen. Wenn der User etwas falsches eingibt, dann ist das keine Exception sondern dann kann man den User darüber informieren und auffordern das richtige einzugeben und das solange bis er das auch tut.
Genauso kann man viele Fehler mit einer Vernünftigen fehlerbehandlung abfangen. Dafür muss man sich aber Gedanken machen und u.u. Viel Code schreiben. DaZu sind die meisten schlicht und einfach zu faul. Eine Exception zu werfen ist ja viel einfacher und. Der User kann ja die Software einfach neu starten nach dem Crash. Wen interessierte.
Vielleicht auch mehr n philosophisches Problem:
Hier im Forum habe ich schon häufiger den Satz gelesen: "Exceptions sollten nicht der Programmsteuerung dienen."
Wäre zur Validierung da nicht z.B. ein boolscher Wert besser?
Von Fluent Interfaces abgesehen haben Setter im Normalfall keinen Rückgabewert. Ich sehe da auch keinen Missbrauch als Programmsteuerung, sondern es ist nun mal das etablierte Vorgehen bei Settern, die reingegebenen Daten zu überprüfen und nicht stillschweigend nichts zu tun oder gar den Objektzustand zu korrumpieren. Der Aufrufer sollte eher dafür sorgen, dass er keinen offensichtlichen Müll in den Setter reingibt. Und genau da kommt die von dir genannte Validierung ins Spiel. Aber eben zwischen Nutzereingabe und möglichem Aufruf des Setters, und nicht erst im Setter.
isValidData von Form sollte man noch umbenennen. Es liefert kein boolean wie die gleichnamige Methode in C, sondern einen int-Code. Also ist vielleicht validateData besser.
Zur ersten Antwort:
Es ist schon richtig, dass man die Libs benutzt. Ich finde es aber ziemlich sinnvoll, die Libs auch mal teilweise selbst zuschreiben, um zu sehen, was da überhaupt passiert!
Ich glaube, das ist noch nicht schön programmiert. Momentan schaut es folgendermaßen aus:
Java:
/**
* Model-Klasse.
* Nimmt ein Datum auf, das zuvor validiert werden muss.
* Sollte ein invalides Datum übergeben werden, wird eine Exception geworfen.
* Zum Validieren wird eine statische Methode bereitgestellt.
*/publicclassC{privateint data;/**
* Prüft die Gültigkeit des Datums.
* @param int data
* @throws IllegalArgumentException
*/publicstaticbooleanisValidData(int data){return data >=0;}/**
* Setzt das Datum.
* @param int data
* @throws IllegalArgumentException
*/publicvoidsetData(int data)throwsIllegalArgumentException{if(!isValidData(data)){thrownewIllegalArgumentException("data");}this.data = data;}/**
* Gibt das Datum zurück.
* @param int
*/publicintgetData(){return data;}}
Java:
/**
* Müssen alle Klassen implementieren, die ein DAtum validieren.
*/publicinterfaceSource{publicstaticfinalint VALID =0;publicstaticfinalint INVALID =1;publicstaticfinalint NOT_A_NUMBER =2;publicstaticfinalint EMPTY =3;publicintvalidateData(String stringData);}
Java:
/**
* Formular-Klasse.
*/publicclassFormimplementsSource{/**
* Prüft, ob im Formular ein gültiges Datum eingegeben wurde.
* @param String stringData
* @return int Ergebnis der Prüfung.
*/publicintvalidateData(String stringData){if(stringData ==""){return EMPTY;}try{int intData =Integer.parseInt(stringData);returnC.isValidData(intData)? VALID : INVALID;}catch(NumberFormatException e){return NOT_A_NUMBER;}}}
Java:
publicclassMain{publicstaticvoidmain(String[] args){String data ="123";Form form =newForm();switch(form.validateData(data)){caseForm.VALID:C c =newC();try{
c.setData(Integer.parseInt(data));System.out.println("data "+ c.getData()+" ist eine gültige Zahl");}catch(NumberFormatException e){System.out.println("Programmierfehler: parseInt wirft Exception trotz vorhergehender Validierung");}catch(IllegalArgumentException e){System.out.println("Programmierfehler: setter wirft Exception trotz vorhergehender Validierung");}break;caseForm.INVALID:System.out.println("data ist keine Zahl >= 0");break;caseForm.NOT_A_NUMBER:System.out.println("data ist keine Zahl");break;caseForm.EMPTY:System.out.println("data ist leer");break;default:System.out.println("Programmierfehler: unbekannte Validierungsrückgabe");}}}
Das Integer.parseInt im Main stört mich irgendwie. Das mache ich schon in der Klasse Form. Ich mache es also doppelt.
Sollte validateData gleich den gültigen Wert (also den int-Wert) zurückgeben?