IllegalArgumentException oder Exception werfen?

Status
Nicht offen für weitere Antworten.

maximilius

Mitglied
Ich habe gelernt, dass Klassen selbst überprüfen sollen, ob sie ihre Nachrichten ausführen, oder nicht.
Ich habe hier eine Beispielklasse geschrieben, die einen Temperaturwert kapselt.
Code:
public class Temperatur {
	private float celsius;

	/**
	 * Erzeugt ein neues Temperatur Objekt und setzt die Temperatur in °C
	 * @param celsius Der Wert der Temperatur.
	 * @throws IllegalArgumentException Wenn der Wert der Temperatur physikalisch nicht möglich ist.
	 */
	public Temperatur(float celsius) throws IllegalArgumentException {
		setValue(celsius);
	}
	
	/**
	 * Setzt die Temperatur in °C
	 * @param celsius Der neue Wert der Temperatur.
	 * @throws IllegalArgumentException Wenn der neue Wert der Temperatur physikalisch nicht möglich ist.
	 */
	public void setValue(float celsius) throws IllegalArgumentException {
		if (celsius < -273.15) {
			throw new IllegalArgumentException("Es existiert keine Temperatur unter -273.15 °C!");
		}
		this.celsius = celsius;
	}
	
	/**
	 * Gibt die Temperatur in °C zurück.
	 */
	public float getValue() {
		return celsius;
	}
}
Wenn man versucht, den Temperaturwert unter 0K zu setzen, wird eine IllegalArumentException geworfen. IllegalArgumentException erbt von RuntimeException und muss daher nicht mittels try-catch abgefangen werden.

Nun interessiert mich eure Meinung:
Sollte ich an der Stelle lieber eine Exception werfen, statt einer IllegalArgumentException, damit Programmierer, die die Temperaturklasse instanziieren, gezwungen sind, eine Fehlerbehandlung zu bauen, damit ihr Programm nicht abrauscht?

lg Stephan
 

tfa

Top Contributor
Wie du es gemacht hast, ist es völlig korrekt. RuntimeExceptions deuten (immer) auf Programmierfehler hin, und es ist eben ein Fehler, den Temperatur-Konstruktor mit weniger als -273.15°C aufzurufen. Der Programmierer könnte den Wert ja vorher einfach prüfen.
 
G

Gast

Gast
Ich würde mir eher ne eigene Exception schreiben die von IllegalArgumentException erbt.
Wir sind die Standard-Exceptions nicht präzise genug.
 
M

maki

Gast
Gast hat gesagt.:
Ich würde mir eher ne eigene Exception schreiben die von IllegalArgumentException erbt.
Wir sind die Standard-Exceptions nicht präzise genug.
Einer der größeren Fehler imho ist zuviele eigene Exceptions zu schreiben (am besten noch nicht mal ordentlich Dokumentiert), ein falscher Parameter lässt sich am besten mit einer IllegalArgumentException beschreiben.
 

Marco13

Top Contributor
Code:
	 * @throws IllegalArgumentException Wenn der Wert der Temperatur physikalisch nicht möglich ist.
ändern in
Code:
	 * @throws IllegalArgumentException Wenn der Wert der Temperatur kleiner als -273.15°C ist
:wink:
 

maximilius

Mitglied
@tfa:

Ich möchte dem Programmierer gerne die Arbeit abnehmen, den Wert zu prüfen. (Wiederverwendung von Code)
Er könnte die Klasse beispielsweise folgendermaßen einsetzen:

Code:
// ...
	public Temperatur benutzerGibtTemperaturEin() {
		Temperatur temperatur = null;
		float eingabe;
		do {
			// eingabe wird mit Benutzereingabe gefüttert
			try {
				temperatur = new Temperatur(eingabe);
			} catch (IllegalArgumentException e) {
				// Warnhinweis für Benutzer ausgeben, dass er eine Temperatur unter 0 K eingegeben hat.
			}
		} while (temperatur == null);
		return temperatur;
	}
	//...

@Marco13:
Du hast vollkommen Recht. Das ist viel sprechender.

lg Stephan
 

Janus

Bekanntes Mitglied
Code:
@param celsius Der neue Wert der Temperatur, -273.15f <= celsius <= Float.MAX_VALUE
@throws IllegalArgumentException Bei ungültigen Parametern.
 

tfa

Top Contributor
Wenn schon, dann richtig:
Code:
@param celsius Der neue Wert der Temperatur, -273.15f <= celsius <=  1.41679e+32f
@throws IllegalArgumentException Bei ungültigen Parametern.
 

Janus

Bekanntes Mitglied
mein beispiel ist richtiger :p
wenn in irgendeiner java version der wertebereich von float verändert wird, stimmt meine aussage immer noch. deine aber nicht.
 

tfa

Top Contributor
Der Wert ist auch nicht Float.MAX_VALUE, sondern die physikalisch maximal mögliche Temperatur (müsste natürlich im Setter auch getestet werden). ;)
 

Janus

Bekanntes Mitglied
tfa hat gesagt.:
Der Wert ist auch nicht Float.MAX_VALUE, sondern die physikalisch maximal mögliche Temperatur (müsste natürlich im Setter auch getestet werden). ;)
wird es aber nicht, und deshalb ist der größte wert, den float annehmen kann, das limit.
 

maximilius

Mitglied
Ich würde gerne zur Ausgangsfrage zurück kehren:
Wir haben festgestellt, dass IllegalArgumentException das treffendste Throwable für das Codebeispiel ist.

IllegalArgumentException muss aber nicht mittels Try-Catch Block abgefangen werden.
Nun die Überlegung: Lieber doch ein Throwable nehmen, welches abgefangen werden muss, damit der Programmierer, der die Klasse einsetzen möchte quasi einen Wink mit dem Zaunpfahl bekommt?

Was denkt ihr?

@JPKI:
Stimmt, habe es editiert.

lg Stephan
 
M

maki

Gast
checked vs. unchecked Exception, die Diskussion ist nicht neu.

Mit der checked Exception zwingt man den nutzer der Klasse/Methode, immer einen try/catch Block bzw. eine throws klausel zu schreiben, geht einem ganz schön auf den Sack, wenn man weiss dass es nicht vorkommt.

Mit einer unchecked Exception (zB. IllegalArgumentException) kann der Nutzer entscheiden, wie er damit umgeht.

Letzteres ist fast immer die bessere Wahl.
 

maximilius

Mitglied
@maki
Die Begrifflichkeit „checked Exception“ war mir nicht bekannt.
Habe danach mal im Forum gesucht und mir ein paar Beiträge durchgelesen.

In diesem Beitrag fand ich dann Folgendes:
Lim_Dul hat gesagt.:
(...)
Generell gilt: CheckedException wirklich nur dann werfen, wenn der Fehler auch durch saubere Programmierung nicht verhindert werden kann. Sonst nur RuntimeExceptions!
(...)

Ich sehe ein, dass man nicht für jede Zeile Code einen Try-Catch Block schreiben kann.
Wenn ich im Temperatur Beispiel die IllegalArgumentException verwende, kann die Klasse in Anwendungen, in der es keine Benutzereingabe der Temperatur gibt, ohne Try-Catch Block verwendet werden und in Anwendungen, wo es eine Benutzereingabe gibt, als Fehlerbehandlung mit Try-Catch Block eingesetzt werden.

lg Stephan
 
M

maki

Gast
Josh Bloch hat sich (unter anderem) darüber ausgelassen in Effective Java, gutes Buch, bald kommt die second edition.
 

Janus

Bekanntes Mitglied
maximilius hat gesagt.:
Ich sehe ein, dass man nicht für jede Zeile Code einen Try-Catch Block schreiben kann.
Wenn ich im Temperatur Beispiel die IllegalArgumentException verwende, kann die Klasse in Anwendungen, in der es keine Benutzereingabe der Temperatur gibt, ohne Try-Catch Block verwendet werden und in Anwendungen, wo es eine Benutzereingabe gibt, als Fehlerbehandlung mit Try-Catch Block eingesetzt werden.

checked exceptions, die bei ungültigen parametern geworfen werden, sind nicht ungewöhnlich. die hauptüberlegung dabei sollte normalerweise schlicht sein, wie einfach es ist, die parameter auf gültigkeit zu prüfen. ein einzelner integer, der nur innerhalb eines bestimmten bereichs liegen darf oder ein paramter, der nicht null sein darf, sind sehr einfach und schnell zu überprüfen. wenn aber diverse parameter in abhängigkeit zueinander stehen oder nur sehr schwer vorher zu prüfen sind (z.b. die verfügbarkeit eines netzwerks VOR der verwendung einer socket klasse), dann ist eine checked exception eine gute lösung, auch für den aufrufer.

man kann es mit den checked exceptions auch zu gut meinen. das verleitet irgendwann dazu, dass entwickler exceptions immer nur durchreichen, anstatt auf sie angemessen zu reagieren. und damit hat man dann auch nichts mehr gewonnen.
 
M

maki

Gast
checked exceptions, die bei ungültigen parametern geworfen werden, sind nicht ungewöhnlich. die hauptüberlegung dabei sollte normalerweise schlicht sein, wie einfach es ist, die parameter auf gültigkeit zu prüfen. ein einzelner integer, der nur innerhalb eines bestimmten bereichs liegen darf oder ein paramter, der nicht null sein darf, sind sehr einfach und schnell zu überprüfen. wenn aber diverse parameter in abhängigkeit zueinander stehen oder nur sehr schwer vorher zu prüfen sind (z.b. die verfügbarkeit eines netzwerks VOR der verwendung einer socket klasse), dann ist eine checked exception eine gute lösung, auch für den aufrufer.
Das Netzwerk ist kein Parameter für Socket ;)
Selbst wenn, wie sollte man in so einem Falle reagieren?
"Netzwerkfehler" ausgeben, und dann?

Ungültige Parameter sind Programmierfehler, sollten mit unchecked Exceptions signalisiert werden (NPE, IlegalArgumentException, IllegalStateException,..)

Es ist einfach so, dass externe Resourcen wie Netzwerke und auch DBs jederzeit wegfallen können, wobei bei letzterem der Trend zu unchecked Exceptions geht (dao), ist nervig überall und jedesmal try/catch zu schreiben, wenn es sowieso keine vernünftige Möglichkeit gibt damit umzugehen...
 

tfa

Top Contributor
Ich habe den Eindruck, dass checked Exceptions langsam aus der Mode kommen. Viele Frameworks wie Spring oder Hibernate werfen heute bevorzugt mit RuntimeExceptions um sich.
Vor einigen Jahren war IIRC z.B. die HibernateException noch checked - was ja auch einleuchtet, da meistens hinter einer HibernateException eine (checked) SQLException steht. Dann dachte man sich, warum sollte man jede Exception behandeln müssen, wenn sie doch meistens zu harten Fehlermeldungen führt? Ich finde das gut so, der Quelltext wird doch um einiges übersichtlicher.
Besonders nervig finde ich ja Java-Reflection. Ständig muss man 3-4 Exceptions auffangen, von denen man sicher ist, dass sie praktisch nie auftreten. Und wenn doch, ist eh alles für die Katz.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M IllegalArgumentException Allgemeine Java-Themen 9
MiMa IllegalArgumentException Allgemeine Java-Themen 4
T komplizierter Comparator (IllegalArgumentException) Allgemeine Java-Themen 3
VfL_Freak IllegalArgumentException beim Obfuskieren mit ProGuard V4.4 Allgemeine Java-Themen 6
hdi Javadoc Comments: IllegalArgumentException deklarieren? Allgemeine Java-Themen 3
faetzminator IllegalArgumentException bei Method.invoke() Allgemeine Java-Themen 6
B Null- oder IllegalArgumentException Allgemeine Java-Themen 12
W Queue.remove() -> no such element exception Allgemeine Java-Themen 17
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
N Kann ich die Nullpointer Exception umgehen Allgemeine Java-Themen 12
N A java Exception has occured Allgemeine Java-Themen 8
G javafx "class path" exception Allgemeine Java-Themen 5
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
tom.j85 Exception bei Abfrage von Ländercodes in API? Allgemeine Java-Themen 13
S Exception Allgemeine Java-Themen 5
LimDul Streams und Exception Allgemeine Java-Themen 8
C FileLock - Exception wird immer geworfen Allgemeine Java-Themen 4
S Wertbeschränkung Exception oder Anpassung? Allgemeine Java-Themen 4
D Nullpointer Exception Problem Allgemeine Java-Themen 5
Kirby.exe Nullpointer Exception bei Queue Allgemeine Java-Themen 5
R Schlüsselworte "Throw new exception" gibt nicht den String als Fehlermeldung aus Allgemeine Java-Themen 2
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
S RMI Exception Allgemeine Java-Themen 0
S MSSQL Exception & Connection String Allgemeine Java-Themen 19
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
coolian warum bekomme ich ein string index out of bounds exception Allgemeine Java-Themen 17
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
M Klassen Serializable Exception Allgemeine Java-Themen 1
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
X jvm exception abfangen und an externes Programm schicken Allgemeine Java-Themen 4
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
B Exception in Application init method Allgemeine Java-Themen 5
H OOP Testen einer Exception mit JUnit Allgemeine Java-Themen 8
M javafx ComboBox- Nullpointer Exception Allgemeine Java-Themen 6
perlenfischer1984 Dialect class not found exception Allgemeine Java-Themen 15
Thallius Bekomme keine Exception mit Stacktrace mehr. Was habe ich getan? Allgemeine Java-Themen 13
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Z Exception wird nicht ausgelöst Allgemeine Java-Themen 2
0 Animiertes Gif anzeigen - NullPointer Exception Allgemeine Java-Themen 19
T Konstruktor löst exception aus Allgemeine Java-Themen 7
KilledByCheese Dezimal nach Hexadezimal rechner wirft seltsame exception Allgemeine Java-Themen 4
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
D Codeausführung bevor Exception abgeschlossen ist Allgemeine Java-Themen 11
T FileNotFound Exception Allgemeine Java-Themen 9
L Exception/Error auf JDialog umleiten Allgemeine Java-Themen 2
C Arithmetic Exception, obwohl nichts 0 ist Allgemeine Java-Themen 5
M A Java Exception has occured. Allgemeine Java-Themen 1
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
E A Java Exception Has Occured Allgemeine Java-Themen 4
T Exception handling Allgemeine Java-Themen 7
P lazy loading exception Allgemeine Java-Themen 0
A Interpreter-Fehler OutOfMemory Exception mit Base64 decode Allgemeine Java-Themen 3
S Java Applet Crash - Keine Exception Allgemeine Java-Themen 8
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P Eigene Exception Klasse Allgemeine Java-Themen 7
N Java Interne Exception Allgemeine Java-Themen 4
B JUnit4 Exception-Test Allgemeine Java-Themen 4
127.0.0.1 SQL Exception, kein Driver Allgemeine Java-Themen 9
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
R ZIP FileSystem unter Windows wirft exception Allgemeine Java-Themen 7
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
Ollek Barcode mit Barcode4J erzeugen - Exception Allgemeine Java-Themen 4
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
E Eigene Exception Klasse erstellen Allgemeine Java-Themen 3
L Variablen IO Exception weil File angeblich nicht exisitert Allgemeine Java-Themen 10
T Exception versus Rückgabeparamter Allgemeine Java-Themen 26
S Exception enableDepthTest Allgemeine Java-Themen 7
M JAXB Reimport zu Hibernate DB -> Exception Allgemeine Java-Themen 3
W Kleine Frage zu Null-Pinter-Exception Allgemeine Java-Themen 21
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
N Runtime.exec() Exception Problem Allgemeine Java-Themen 3
P Default constructor cannot handle exception type Allgemeine Java-Themen 6
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
S Bildaufbau durch Servlet -> Exception Allgemeine Java-Themen 11
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
S Exception beim Schreiben des Dataset in XML Datei Allgemeine Java-Themen 8
M Webstart Exception trotz signierten JARs Allgemeine Java-Themen 3
E Interpreter-Fehler unbekannte Exception Allgemeine Java-Themen 12
B Komische Exception Allgemeine Java-Themen 4
U SwingWorker und Exception Allgemeine Java-Themen 3
B Nullpointer Exception in Array Allgemeine Java-Themen 15
G WebService Exception Allgemeine Java-Themen 3
M Best Practices Exception Handling für eigene library Allgemeine Java-Themen 8
G PermSpace Exception Allgemeine Java-Themen 2
S Invalid Chunk Exception Allgemeine Java-Themen 3
N URLClassLoader Exception Allgemeine Java-Themen 5
Apo Java Sound Mark/Reset Exception Allgemeine Java-Themen 14
M Exception ganz sehen Allgemeine Java-Themen 2
D Problem mit EasyMock und Exception Allgemeine Java-Themen 6
B Exception wird geworfen, ich darf sie aber nicht abfangen. Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben