Exceptions werfen

firefexx

Mitglied
Hi,

bisher habe ich überwiegend Websites programmiert mit XHTML, CSS, JS und PHP mit MySQL. Um nun auch in die Anwendungsentwicklung einzusteigen habe ich mich für die Sprache Java entschieden. Neu für mich ist auch OOP.
Bei meiner Suche im Internet bin ich dabei auf dieses Forum gestoßen. Hier auch direkt meine erste Frage: ^^

Zum Üben habe ich eine Klasse "Fraction" geschrieben, die einen mathematischen Bruch repräsentiert. Mit den Methoden lassen sich dann die üblichen Rechenoperationen durchführen. Das ganze funktioniert soweit recht gut. Jetzt bin ich aber beim Thema Exceptions angekommen. Ein Fehler oder eine Ausnahme liegt ja in meiner Klasse beispielsweise dann vor, wenn jemand ein Objekt mit Nenner 0 erzeugt. [z.B.: Fraction f = new Fraction(5, 0); erster Parameter ist der Zähler, zweiter der Nenner] Das ist ja ungültig da der Nenner nie 0 sein darf -> Division durch 0.
Bisher habe ich im Konstruktor folgendes stehen:
Java:
if(denominator != 0) {
	// Werte initialisieren usw.
} else {
    // TODO: durch Exception ersetzen!!
    System.err.println("Nenner darf nicht 0 sein! Programm beendet!");
    System.exit(1);
}
Die Idee so einen Fehler abzufangen stammt noch aus der Zeit in der ich funktional programmiert habe. Bei Java ist es doch eher die feine Art eine Exception zu werfen, oder irre ich?
Habe mir überlegt es so zu machen:
Java:
if(denominator == 0) {
    throw new XXXException("Nenner darf nicht 0 sein!");
}
Jetzt müsste ich nur noch wissen was für eine Exception ich da am besten verwende. Eine RuntimeException wahrscheinlich, da diese nicht zwingend behandelt werden muss aber welche Unterklasse passt dann am besten? Eine IllegalArgumentException oder eine ArithmeticException?? Ich bin derzeit etwas ratlos wie ich das alles am beste realisiere mit den Fehlern. (Danach werden für die Klasse noch zwei andere Ausnahmen ausgelöst. Einmal wenn null übergeben wird - NullPointerException?! und einmal wenn durch einen Bruch mit Zähler = 0 dividiert wird - also Division durch 0 - ArithmeticException?!)

Kann mir jemand helfen, also erklären ob die Idee und die Umsetzung so vernünftig ist oder wie man das richtig macht?

Vielen Dank!
VG
 
Zuletzt bearbeitet:

musiKk

Top Contributor
Die Idee so einen Fehler abzufangen stammt noch aus der Zeit in der ich funktional programmiert habe.

Du meinst wahrscheinlich prozedural. Funktional im klassischen Sinn ist PHP jedenfalls nicht. Davon abgesehen ist es in wahrscheinlich jedem System ungünstig, das Programm aufgrund eines solchen Fehlers hart zu beenden.

Eine IllegalArgumentException oder eine ArithmeticException??

Du kannst per Dokumentation für Methoden und Konstruktoren Verträge festlegen, die z. B. auch spezifizieren, wie die Argumente auszusehen haben. Wird dann ein Argument übergeben, das diesem Vertrag nicht entspricht, ist es in der Tat recht üblich, eine IllegalArgumentException zu werfen. Allerdings wäre in Deinem Fall eine ArithmeticException auch nicht verkehrt. Das hat (ebenso wie ein verbotener null-Parameter mit folgender NullPointerException) den Vorteil, dass Du Das nicht explizit programmieren musst; die entsprechende Exception fliegt bei der Division durch Null (oder Verwendung der Referenz) von alleine.
 

firefexx

Mitglied
Hi, danke für die Antwort.

Kannst du mir das mit den Verträgen erklären? Klingt interessant, habe ich aber noch nichts von gehört.

Habe das ganze jetzt so gelöst. Ein Fehler kann im Konstruktor auftreten wenn der Nenner 0 ist. Das ganze wird so gelöst:
Java:
public Fraction(int numerator, int denominator) {
	/* Hauptkonstruktor:
	 * Zähler und Nenner werden mit Werten initialisiert */
	if(denominator == 0) {
		throw new IllegalArgumentException("Denominator = 0 isn't allowed!");
	}
	this.numerator = numerator;
	this.denominator = denominator;
	this.reduce(); // Bruch kürzen!
}
Der nächste Fehler ist die Division durch 0:
Java:
public Fraction divide(Fraction fraction) {
	/* Primäre Divisionsmethode:
	 * Liefert den Quotienten der beiden Brüche.
	 * Kehrwert wird an die Multiplikationsmethode deligieren. */
	if(fraction.numerator == 0) {
		throw new ArithmeticException("Division by 0!");
	}
	return this.multiply(fraction.denominator, fraction.numerator);
}
Den Fehler mit der NullPointerException betrachte ich nicht selbst, da diese von alleine geworfen wird. Bei den andern beiden ist das nicht der Fall da keine wirkliche Rechenoperation durchgeführt wird.

Gibt es bei dem Stil, der Art das zu lösen usw. etwas zu beanstanden oder ist das so korrekt? Lege viel Wert auf anständigen Code..

VG
 

musiKk

Top Contributor
Ich finde das so ok. Gerade im Konstruktor gibt es außer einer Exception keine sinnvollere Möglichkeit, einen Fehler mitzuteilen. Wie gesagt, das Programm zu beenden ist designtechnisch definitiv verboten.

Die Sache mit den Verträgen ist eigentlich recht trivial. Man definiert Vor- und Nachbedingungen; was kann rein, was kommt raus. Das kann man im Javadoc angeben:
Java:
/**
 * Performs division ...
 * @param fraction the divisor, must not be zero
 * @return the quotient
 * @throws ArithmeticException if the divisor is zero
 */
public Fraction divide(Fraction fraction) {
Jeder, der also eine ArithmeticException erhält, hat den Vertrag gebrochen, der hier definiert wurde. Hier würde ich sogar sagen, dass der [c]@throws[/c]-Teil optional ist. Wenn der Divisor Null ist, dann ist das ein Fehler, basta. Man kann das aber auch so hinschreiben, dann wirds etwas deutlicher; ist Geschmackssache.

Theoretisch kann man die Sache mit den Verträgen noch etwas umfangreicher gestalten, aber Java verfügt standardmäßig über keine Formalismen. In der Regel kommt man aber auch ohne die klar.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Exceptions werfen oder catchen?? Java Basics - Anfänger-Themen 14
D Exceptions werfen + beenden Java Basics - Anfänger-Themen 12
T Problem beim Werfen und Fangen von Exceptions Java Basics - Anfänger-Themen 2
M Test auf Exceptions schreiben Java Basics - Anfänger-Themen 11
berserkerdq2 Habe zwei exceptions, welche ist ein Kommunikationsfehler und welche ein Ausgabefehler? Java Basics - Anfänger-Themen 4
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
C Exceptions identifizieren Java Basics - Anfänger-Themen 5
A Exceptions mit objektreferenzen Java Basics - Anfänger-Themen 4
A Exceptions und methods Java Basics - Anfänger-Themen 2
A Cannot find symbol bei exceptions Java Basics - Anfänger-Themen 2
A Exceptions und Packages Java Basics - Anfänger-Themen 6
B JUnit / Exceptions/ try-catch Java Basics - Anfänger-Themen 6
X Exceptions Benutzereingaben Java Basics - Anfänger-Themen 4
F Exceptions in Interfaces Java Basics - Anfänger-Themen 4
F Mehrere Exceptions in einem Catch-Block abfangen Java Basics - Anfänger-Themen 12
L Exceptions und Konten Java Basics - Anfänger-Themen 21
D Frage zu Exceptions Java Basics - Anfänger-Themen 8
G Wie programmiert man Exceptions? Java Basics - Anfänger-Themen 4
N Unterschied zwischen Checked und Unchecked Exceptions Java Basics - Anfänger-Themen 12
C Erste Schritte Exceptions nicht verstanden Java Basics - Anfänger-Themen 2
J Fragen zu Exceptions Java Basics - Anfänger-Themen 24
T Exceptions - ausgeführte Zeilen Java Basics - Anfänger-Themen 4
J Exceptions Java Basics - Anfänger-Themen 69
C Exceptions Java Basics - Anfänger-Themen 8
C Exceptions Java Basics - Anfänger-Themen 6
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3
F Exceptions Java Basics - Anfänger-Themen 6
J Frage zum Thema Exceptions (Try/Catch) Java Basics - Anfänger-Themen 3
M "Exceptions abfragen" Java Basics - Anfänger-Themen 6
Farbenfroh Exceptions Anfänger - Finde Fehler nicht Java Basics - Anfänger-Themen 7
Z Catch & Exceptions Java Basics - Anfänger-Themen 4
N Compiler-Fehler Drei Exceptions in GUIHack für Dreiecke auf MoveButtons Java Basics - Anfänger-Themen 36
V Welche Exceptions müssen importiert werden? Java Basics - Anfänger-Themen 3
S Exceptions Java Basics - Anfänger-Themen 7
M Vererbung Problem Vererbung/Exceptions Java Basics - Anfänger-Themen 9
S Verschachtelte Exceptions - Übersicht verbessern Java Basics - Anfänger-Themen 2
J Eclipse Exceptions Java Basics - Anfänger-Themen 2
K Schleifen und Exceptions Java Basics - Anfänger-Themen 8
K Exceptions auslagern Java Basics - Anfänger-Themen 15
R NullPointer Exceptions Java Basics - Anfänger-Themen 3
F Erste Schritte Übung zu Exceptions Java Basics - Anfänger-Themen 24
R Exceptions (try/catch) Java Basics - Anfänger-Themen 63
H Int Exceptions Java Basics - Anfänger-Themen 12
M Exceptions per throws oder try Java Basics - Anfänger-Themen 4
M Compiler-Fehler Queue als ArrayList mit Exceptions Java Basics - Anfänger-Themen 3
T Exceptions in einer Klasse Java Basics - Anfänger-Themen 3
B Eigene Exceptions entwerfen Java Basics - Anfänger-Themen 3
H Methoden Überflüssige Exceptions Java Basics - Anfänger-Themen 20
C Exceptions Java Basics - Anfänger-Themen 14
1 While Schleife Exceptions Java Basics - Anfänger-Themen 6
I Erste Schritte Eigene Fehlermeldungen bei Exceptions Java Basics - Anfänger-Themen 19
D Frage zu Exceptions Java Basics - Anfänger-Themen 12
M Compiler-Fehler Exceptions lieber throwen oder direkt catchen? Java Basics - Anfänger-Themen 8
T Exceptions Java Basics - Anfänger-Themen 19
B Wie finde ich Exceptions? Java Basics - Anfänger-Themen 19
Dit_ Input/Output Alle Exceptions protokollieren Java Basics - Anfänger-Themen 9
T Exceptions Java Basics - Anfänger-Themen 12
J Standard Exceptions abfangen Java Basics - Anfänger-Themen 5
D Exceptions - Ausnahmebehandlung Java Basics - Anfänger-Themen 19
D Frage zu Exceptions und der import Anweisung Java Basics - Anfänger-Themen 12
J Paar Fragen zu Exceptions Java Basics - Anfänger-Themen 16
G Verständnisproblem: Exceptions Java Basics - Anfänger-Themen 17
S Exceptions bei push/pop in Stack Java Basics - Anfänger-Themen 8
C Exceptions beim Beenden Java Basics - Anfänger-Themen 2
C TimerTask und Exceptions Java Basics - Anfänger-Themen 5
E Klasse öffnen, mehrere Exceptions Java Basics - Anfänger-Themen 9
C Exceptions Java Basics - Anfänger-Themen 7
G 2 Exceptions in einer Methode Java Basics - Anfänger-Themen 3
0 Exceptions mehrfach fangbar? Java Basics - Anfänger-Themen 4
O Exceptions Java Basics - Anfänger-Themen 3
K Sinn eigener Exceptions Java Basics - Anfänger-Themen 11
H Diverse Exceptions - Troubleshooting Java Basics - Anfänger-Themen 3
J exceptions Java Basics - Anfänger-Themen 8
sc0p InterruptedExceptions und Exceptions - in Einem! Java Basics - Anfänger-Themen 5
M Frage zu Exceptions Java Basics - Anfänger-Themen 19
M Fragen zu Exceptions Java Basics - Anfänger-Themen 3
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
M Exceptions aus interface-Methoden Java Basics - Anfänger-Themen 2
S File.renameTo und Exceptions / Fehlermeldung Java Basics - Anfänger-Themen 2
B Exceptions in Liste sammeln? Java Basics - Anfänger-Themen 5
O Eigene Exceptions Java Basics - Anfänger-Themen 11
O "restliche" Exceptions fangen Java Basics - Anfänger-Themen 8
H [Stil] Exceptions in der Klasse behandeln oder throwen? Java Basics - Anfänger-Themen 62
V Aktivitätsdiagramm / Exceptions Java Basics - Anfänger-Themen 5
V Exceptions Java Basics - Anfänger-Themen 6
K Frage zu Exceptions -> Logging Java Basics - Anfänger-Themen 6
M Eigene Fehlermeldung bei Exceptions? Java Basics - Anfänger-Themen 12
R JDom Exceptions Java Basics - Anfänger-Themen 4
R Datei einlesen mit Exceptions Java Basics - Anfänger-Themen 2
Daniel_L Verwendung von try und catch bei exceptions Java Basics - Anfänger-Themen 7
C Reflection Exceptions behandeln Java Basics - Anfänger-Themen 6
G Exceptions - spiegeln wir da nicht einen Spiegel im Spiegel? Java Basics - Anfänger-Themen 10
G Verschiedene Exceptions zu gleichem Block Java Basics - Anfänger-Themen 6
U Frage zu Exceptions Java Basics - Anfänger-Themen 5
mwildam Philosophiefrage zu Exceptions und Rückgabewerten Java Basics - Anfänger-Themen 6
D Static, final Objekte mit Exceptions im Konstruktor Java Basics - Anfänger-Themen 2
G Exceptions Java Basics - Anfänger-Themen 4
G ServerSocket: Exceptions und Timeout Probleme Java Basics - Anfänger-Themen 10
M Exceptions bei Textfeldern abfangen Java Basics - Anfänger-Themen 2
P Problem mit exceptions Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben