Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Allgemeine Java-Programmierung > Wo werden Fehler abgefangen?
Antwort
 
Themen-Optionen
Alt 15.01.2005, 15:11   Nach oben    #1
ginger_c
Gast
 
Beiträge: n/a
Standard Wo werden Fehler abgefangen?

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;
...
}
Wo überprüfe ich aber nun, ob diese PLZ wirklich fünf-stellig sind?

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;
}
Das hab ich aber noch nirgends gesehen.
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
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2005, 20:54   Nach oben    #2
Sym
Chefkoch-Mod
 
Benutzerbild von Sym
 
Registriert seit: 30.05.2004
Beiträge: 433
Standard

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
Sym ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2005, 01:40   Nach oben    #3
Fuzzy
Gast
 
Beiträge: n/a
Standard

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 höchstens, dass der Konstruktor so groß ist und überhaupt die Postleitzahl setzen kann. Viele ältere Entwickler ziehen kleine Konstruktoren vor, die keine Exceptions werfen. Das hat meiner Meinung nach aber nur historische Gründe, denn in C++ waren Exceptions in Konstruktoren eine prima Möglichkeit, um Speicherlecks zu produzieren.

Ungewöhnlich ist vielleicht auch die Stellung der Exception im Code. Die meisten Programmierer, die ich kenne, schreiben lieber:

Java Code:
  1. public void setPlz(String plz) {
  2.   if (plz.length() > 5)
  3.     throw new IllegalArgumentException();
  4.   this.plz = plz;
  5. }

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.
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2005, 09:07   Nach oben    #4
ginger_c
Gast
 
Beiträge: n/a
Standard Fehlermeldung

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
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2005, 11:02   Nach oben    #5
Fuzzy
Gast
 
Beiträge: n/a
Standard

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;
	}
}
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2005, 14:51   Nach oben    #6
ginger_c
Gast
 
Beiträge: n/a
Standard

Danke, hast mir sehr geholfen

Tina
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ä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


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:32 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44