![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Gast
Beiträge: n/a
|
Hallo,
habe eine Frage, wo denn die Fehlerbehandlung in einer Klasse stattfindet. Beispiel: Code:
public class Adresse {
privat String plz;
...
public Adresse(..., String plz, ...){
this.plz = plz;
...
}
Eine Möglichkeit, die ich sehe, ist es, im Konstruktor evtl eine setPlz(String plz)-Methode aufzurufen und in dieser Set-Methode zu prüfen. Code:
public Adresse (..., String plz, ...){
setPlz(plz);
...
}
public void setPlz(String plz){
if (plz.length() < 5)
this.plz = plz;
else
throw new IllegalArgumentException e;
}
Laut unserem Prof muss die Prüfung aber unbedingt in der Klasse selbst stattfinden, was ja eigentlich auch sinnvoll ist. Also, wo macht man das? Vielen Dank für Eure Hilfe, liebe Grüße, Tina |
|
|
|
Nach oben #2 |
|
Chefkoch-Mod
Registriert seit: 30.05.2004
Beiträge: 433
|
Hi,
ich hoffe, ich habe Dich richtig verstanden. Du kannst (bzw. solltest) den Fehler schon in der jeweiligen Methode senden. Allerdings muss die Methode in Java auch wissen, dass sie Fehler schmeißen kann. Bsp: Code:
public void setPlz(String plz) throws IllegalArgumentException {
if (plz.length() < 5)
* * this.plz = plz;
else
* *throw new IllegalArgumentException e;
}
__________________
Denk mal darüber nach... Lars ACHTUNG: wenn ich von Klassen spreche, könnte ich auch deren Instanzen meinen. www.linuxforen.de +++ www.macuser.de +++ www.mrunix.de +++ www.lmprojects.de |
|
|
|
|
|
Nach oben #3 |
|
Gast
Beiträge: n/a
|
Das ist in diesem Fall nicht notwendig. Die IllegalArgumentException leitet sich von RuntimeException ab. Alle Exceptions, die sich von RuntimeException ableiten, brauchen nicht deklariert zu werden. Völlig korrekt ist daher:
Code:
public void setPlz(String plz) {
if (plz.length() <= 5)
this.plz = plz;
else
throw new IllegalArgumentException();
}
Ungewöhnlich ist vielleicht auch die Stellung der Exception im Code. Die meisten Programmierer, die ich kenne, schreiben lieber: Java Code:
Es ist noch anzumerken, dass neben der IllegalArgumentException auch eine NullPointerException vom Code geworfen wird, wenn nämlich der Aufrufparameter null ist. Die NullPointerException ist auch von RuntimeException abgeleitet und wird ebenfalls nicht deklariert. |
|
|
|
Nach oben #4 |
|
Gast
Beiträge: n/a
|
Ok, ich fange also meine Fehler in den Set-Methoden des Konstruktors
ab. Jetzt stelle ich mir vor, ich lese meine Daten aus einer GUI und schreibe sie dann per Konstruktor in einen neuen Kunden. Es sind einige Felder falsch ausgefüllt, z.B. PLZ und Geburtsdatum. Im Konstruktor wird dann beim ersten Fehler, also PLZ eine Exception geworfen, es wird abgebrochen und der Fehler im Geburtsdatum bleibt hier an dieser Stelle unentdeckt. Ist aber auch nicht optimal, denn ich will ja eigentlich an dieser Stelle aus allen Exceptions eine Fehlermeldung generieren, die alle Fehler anzeigt. Wie gehe ich dann vor? Wo generiere ich die Fehlermeldung? Liebe Grüße, Tine |
|
|
|
Nach oben #5 |
|
Gast
Beiträge: n/a
|
Hi
Da muß ich mal etwas ins Detail gehen: Die IllegalArgumentException ist eine RuntimeException (wie schon oben erläutert). Solche RuntimeException sollen in Java Programierfehler anzeigen und keine Eingabefehler des Benutzers. Die Länge der Postleizahl sollte also schon die Eingabemaske geprüft haben und die IllegalArgumentException ist nur eine Rückversicherung für Dich, dass die Eingabemaske auch die Prüfung wirklich durchgeführt hat. Normale Exceptions für das Abfangen ungewöhnlicher Situationen verwendet werden, wenn z.B. eine Datei nicht auf der Platte vorhanden ist, obwohl sie da sein müßte etc. Flasche Benutzereingaben sind aber nicht so ungewöhnlich, dass sie mit Exceptions abgefangen werdne sollten. Wenn der Professor nicht auf Exceptions bestehen würde, würde ich Dir für diesen Fall ganz dringend raten: Benutze keine Exception, sondern frage die Fehler ganz normal ab. Dafür kann man z.B. eine statische Methode einrichten, die falsche Werte erkennt und eine eine boolean zurückgibt, wenn der Wert falsch ist bzw. einen kurzen String mit der Fehlermeldung. Nun besteht der Professor aber wohl auf Exceptions. In einem solchen Fall sind "normale" Exceptions angeraten. Solche Exceptions werden als eigene Klassen angelegt und deklariert. Sie enthalten dann z.B. die Fehlerursache. Ich habe Dir mal einen Code aufgeschrieben. Der Code ist auch nicht unbedingt üblich. Das liegt aber daran, dass die Anforderung nach einer Exception mit einer Liste von Fehlern sehr selten ist. Die Klasse verfügt zusätzlich über zwei Methoden, mit denen die Korrektheit der Werte abgefragt werden kann. Da die Methoden statisch sind, können sie auch aufgerufen werden, ohne das ein Objekt angelegt werden muß. Code:
import java.util.ArrayList;
import java.util.Collection;
public class Adresse {
private String plz;
private String name;
public Adresse(String name, String plz) throws UngueltigeAdresse {
Collection<String> errors = new ArrayList<String>();
if (validateName(name) != null)
errors.add(validateName(name));
else
this.name = name;
if (validatePlz(plz) != null)
errors.add(validatePlz(plz));
else
this.plz = plz;
if (errors.size() > 0)
throw new UngueltigeAdresse(errors.toArray(new String[0]));
}
public static String validateName(String name) {
if (name.length() > 20)
return "Der Name ist zu lang";
return null;
}
public void setName(String name) {
if (validateName(name) != null)
throw new IllegalArgumentException();
this.name = name;
}
public static String validatePlz(String plz) {
if (plz.length() > 5)
return "Die Postleitzahl ist zu lang";
if (plz.length() < 4)
return "Die Postleitzahl ist zu kurz";
return null;
}
public void setPlz(String plz) {
if (validatePlz(plz) != null)
throw new IllegalArgumentException();
this.plz = plz;
}
}
public class UngueltigeAdresse extends Exception
{
private String[] errors;
public UngueltigeAdresse(String[] errors)
{
super("Ungültige Adresse");
this.errors = errors;
}
public String[] getErrors()
{
return errors;
}
}
[/highlight]
Der Code verwendet bereits an einer Stelle JAVA 5.0 Sprachelemente. Für Java 1.4 sieht der Code so aus:
[highlight=Java]
import java.util.ArrayList;
import java.util.Collection;
public class Adresse {
private String plz;
private String name;
public Adresse(String name, String plz) throws UngueltigeAdresse {
Collection errors = new ArrayList();
if (validateName(name) != null)
errors.add(validateName(name));
else
this.name = name;
if (validatePlz(plz) != null)
errors.add(validatePlz(plz));
else
this.plz = plz;
if (errors.size() > 0)
throw new UngueltigeAdresse((String[])errors.toArray(new String[0]));
}
public static String validateName(String name) {
if (name.length() > 20)
return "Der Name ist zu lang";
return null;
}
public void setName(String name) {
if (validateName(name) != null)
throw new IllegalArgumentException(validateName(name));
this.name = name;
}
public static String validatePlz(String plz) {
if (plz.length() > 5)
return "Die Postleitzahl ist zu lang";
if (plz.length() < 4)
return "Die Postleitzahl ist zu kurz";
return null;
}
public void setPlz(String plz) {
if (validatePlz(plz) != null)
throw new IllegalArgumentException(validatePlz(plz));
this.plz = plz;
}
}
public class UngueltigeAdresse extends Exception
{
private String[] errors;
public UngueltigeAdresse(String[] errors)
{
super("Ungültige Adresse");
this.errors = errors;
}
public String[] getErrors()
{
return errors;
}
}
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Seltsamer Fehler ... | Basti | PHP-Programmierung | 3 | 29.05.2007 17:50 |
| Merkwürdiger Fehler von mysql_fetch_object - Bug? | Artemis | PHP-Programmierung | 8 | 06.01.2007 22:40 |
| Fehler ignorieren mit @; wann überhaupt sinnvoll? | Ben | PHP-Programmierung | 26 | 29.05.2006 23:12 |
| Fehler im PHP Parser oder lag der Fehler doch bei mir? | Prophet | PHP-Programmierung | 4 | 12.05.2006 17:17 |
| fehler am server oder fehler am script | vodan | PHP-Programmierung | 26 | 23.05.2005 00:28 |