Java: Wann sind Exceptions zu verwenden?

hallo :-),

bin gerade dabei mein erstes java programm zu schreiben und habe ein
problem mit der entscheidung ob ich für einen besonderen teil code
eine exception schreiben soll oder nicht.

konkret:

ich habe eine klasse vector. bei der erzeugung eines vektors (double-
array mit 3 werten wird übergeben) wird,
die methode setVector(double v) aufgerufen.

in setVector wird als erstes mit einem try {} catch {} block
getscheckt, ob die länge des vektors null ist, in dem setLength
aufgeufen wird, welche eine VectorZeroLengthException wirft, wenn die
länge == 0 ist.

macht das sinn?

nun kann man eine instanz von Vector aber auch ohne parameter
aufrufen. dadurch wird dann natürlich nicht getscheckt, ob länge == 0.

man setzt die elemente des vektors dann mit setEl(index, double value).

da die länge nun aber nicht geprüft wird, kann sie auch 0 sein und
dadurch könnte es zu problemen bei der berechenung kommen.

wie könnte man das am geschicktesten lösen?

zum besseren verständnis ausschnitte aus dem code:

bin gerade dabei mein erstes java programm zu schreiben und habe ein
problem mit der entscheidung ob ich für einen besonderen teil code
eine exception schreiben soll oder nicht.

Die Klasse macht so wenig Sinn.

Warum soll es moeglich sein die Elemente eines Vektors und seine Laenge
getrennt voneinander zu setzen?

public void setLength(double v) sollte es gar nicht geben.

Wenn ich die Laenge brauche, ohne ein Vektor Object anzulegen,
waere wenn schon ein public static double computeLength(double v)
sinnvoll, ohne das der berechnete Wert in eine Objektvariable
abgelegt wird.

Zur Exception:
Ein Vektor kann die Laenge 0.0 haben (wenn alle Elemente 0.0 sind).
Es kann sein, dass Du eine Richtungsvektor hast: ein Vektor, der nicht
Laenge 0.0 haben darf. Das modellierst Du aber dann nicht in
Vektor 'rein sondern in Richtungsvektor.

Wenn das eine Java Frage gewesen waere, waere sie uebrigens besser auf
jugbz-list aufgehoben! So ist es eine Frage, die nirgends hin passt,
also geht lugbz-list wohl gut :wink:

Bye, Chris.

Lukas Pitschl wrote:

hallo :-),

[..]

hoffe mir kann jemand helfen

ich empfehle dazu das skriptum zur vorlesung objektorientierte
programmierung am complang-institut der tu wien:
http://www.complang.tuwien.ac.at/franz/objektorientiert.html

(ob und wann es sinnvoll ist solche ueberpruefungen zu machen haengt von
den preconditions ab die man fuer die klasse/methode angenommen hat,
siehe an seite 59.., siehe auch ab seite 134)

peter

Hallo Lukas!

Für Java-Fragen gibt es die Mailingliste der Java User Group Bozen.
Schau mal auf http://jug.bz vorbei!

Ich würde dir aber auch raten die Klasse java.util.ArrayList anzuschauen.

Lukas Pitschl schrieb:

    public double getLength() {
        try {
            if(this.length == 0) this.setLength(this.vector);
        }
        catch(VectorZeroLengthException e) {
            System.out.println(e.getMessage(new String(new
StringBuffer().append(""))));
        }
        return this.length;
    }

Kleine Empfehlung: Man sollte es vermeiden in get-Methoden Member zu
verändern. Das kann viel Kopfschmerzen beim Debuggen vermeiden!

Zur Frage der Exceptions: Eine Exception wird dann benutzt, wenn man auf
eine Fehlersituation nicht sinnvoll reagieren kann und die
Fehlerbehandlung dem Aufrufer überlassen will.

Nehmen wir zum Beispiel einen JDBC-Treiber, der auf eine remote
Datenbank zugreifen soll. Wenn keine Netzwerkverbindung besteht, kann
die Implementierung in der connect-Methode nicht viel machen. Ein
übereifriger Programmierer könnte einen Verbindugsaufbau starten. Das
ist aber keine gute Idee, da er keine Kenntnis über den Kontext hat:
Welche Verbindung soll gestartet werden? Soll dem Benutzer ein Dialog
angezeigt werden? Gibt es eine graphische Oberfläche oder wird der
Treiber in einem Applicationserver ausgeführt? ...??? Alles Fragen auf
die ein Treiberprogrammierer nicht achten kann und auch nicht achten
soll. Also wirft er eine Exception aus, die dem Aufrufer mitteilt, dass
die connect-Methode ihre Arbeit nicht durchführen konnte. Die Exception
beinhaltet auch Hinweise auf den Grund des Scheiterns. Der Aufrufer, der
mehr Kenntnisse über die Umgebung hat, kann dann eventuell reagieren.

    public void setLength(double v) throws VectorZeroLengthException {
        this.length = Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2) + Math.pow(v[2],2));

        if(this.length == 0) throw new VectorZeroLengthException();
    }

Ich muss zugeben, dass ich den Sinn dieser Methode (eigentlich der
ganzen Klasse) nicht ganz verstanden habe. Vielleicht solltest du diese
Methode nicht einfach setLength nennen. Vielleicht wär
calcLength(double values) besser?

Es scheint mir aber auch komisch zu sein, dass du aufgrund eines intern
berechneten Ergebnisses eine Exception auswirfst.

Vielleicht formulierst du die Frage neu und schickst sie an die JUGBZ
Mailinglist. Bitte formuliere die Frage so, dass das gewünschte
Endergebnis enthalten ist.

Happy hacking!
Patrick

- --
Save software competition, use Free Software like GNU/Linux!
And visit http://www.lugbz.org the Linux User Group in South Tyrol