Skip to main content

Du musst in Java nicht jede Exception fangen

Java Exception fangen Beispiel

Kennst du die Metapher mit dem Jongleur und den Bällen?

Ein Jongleur hält drei Bälle in der Luft, dann vier und irgendwann fünf.
Aber irgendwann ist es genau ein Ball zu viel.
Und Alles bricht zusammen.

Ja ein Ball zu viel, kann alles versauen. 🙂

Java Exception zu viele fangen

Und so ist es doch immer im Leben.
Du kannst dich um zwei oder drei Dinge gleichzeitig kümmern.
Vielleicht sogar um vier oder fünf. Irgendwann ist aber immer Schluss – Ende.

Dann bricht alles zusammen.
Für manche Menschen endet das Spiel mit zu vielen Bällen im Burnout oder in einer Depression.

Eines der besten Bücher, welches ich kenne behandelt dieses Thema ebenfalls.
Das Buch „Der Weg zum erfolgreichen Unternehmer“ ist so geil – Dieses lese ich eigentlich jedes Jahr einmal.
Also immer wieder.

Denn hier geht es ganz klar um Fokussierung und eben darum, nicht jeden Ball zu fangen.
Wer von Euch ein Business aufbauen möchte oder mit seinem Java Programm irgendwann einmal, kommerziell Geld verdienen will – sollte dieses Buch mal gelesen haben.
Es ist wirklich empfehlenswert.

So genug Werbung.
Aber es ist eine perfekte Überleitung zum Fangen von Exceptions.
Denn dies gestaltet sich mitunter schwierig.
Du kannst nicht jede Ausnahme bzw. Ausnahmentyp separat abfangen, oder?

Irgendeine Exception flutscht immer durch.
An irgendetwas hast du nicht gedacht.
Irgendeine falsche Benutzereingabe oder sonstige Ausnahme führt unweigerlich zum Softwareabsturz.

Doch zum Glück gibt es in Java das Feature Polymorphie. Dadurch musst du nicht jede Ausnahme behandeln.

Es kann wirklich ganz schön stressig werden, jede mögliche Ausnahme abzufangen.

Aber zum Glück ist Java eine objektorientierte Programmiersprache mit der Möglichkeit zur Vererbung.
Wirf doch mal einen Blick in die Java API Docs.
Und suche dir einmal die Klasse Exceptions.

Java Exception Klasse

Du siehst – jede Menge Unterklassen.
Und alle diese erben von der Klasse Exception.
Java Exception Kindklassen

Kannst du dich noch an das Beispiel zu den Exceptions errinnern.

Dies haben wir in einen der letzten Beiträge behandelt.
Zur Erinnerung – Wir haben die Exception für die Division durch Null abgefangen.
Hier nochmal der Code dazu:

public class TryUndCatchDemo {

	public static void main(String[] args) {
		int dividend = 10;// Dividend erhält den Wert 10
		int divisor = 0;// Divisor mit Wert 0

		try {
			System.out.println(dividend / divisor);// Bildschirmausgabe 10 /0
		} 
		catch (ArithmeticException eNull) {
			System.out.println("Division durch 0 ist nicht möglich");
		}
	}
}

Wir haben also ganz konkret eine ArithmeticException behandelt und gefangen.
Jetzt such doch einmal unsere behandelte Ausnahme – also die Subklasse „ArithmeticException“ – in den API Docs.
Nicht zu finden, oder?

Was bedeutet das?
ArithmeticException ist scheinbar keine Kindklasse von Exception.

Was dann?
Du kannst diese Klasse direkt in den API Docs suchen oder du kennst bereits den Vererbungsbaum dieser Exception.
Hier der Baum:

Java Exception Vererbungsbaum

Was bedeutet das?
Durch Polymorphie ist es möglich, ein Objekt in einem anderen allgemeiner Datentypen der selben Vererbungslinie zu speichern.

Du kannst somit die Ausnahme entweder mit einem Objekt der Kindklasse ArithmeticException, mit der Kindklasse RuntimeException oder aus der Superklasse Exception fangen.

Also dann – Lass uns diese Exception mal auf verschiedene Art und Weise fangen.

Zum Beispiel mit der RuntimeException.
Dazu brauchst du nur ein anderes Objekt anlegen.
Aus ArithmeticException wird RuntimeException.

public class TryUndCatchDemo {

	public static void main(String[] args) {
		int dividend = 10;// Dividend erhält den Wert 10
		int divisor = 0;// Divisor mit Wert 0

		try {
			System.out.println(dividend / divisor);// Bildschirmausgabe 10 /0
		} 
		catch (RuntimeException eNull) {
			System.out.println("Division durch 0 ist nicht möglich");
		}
	}
}

Klar kannst du die Exception auch mit einem Objekt der Klasse Exception fangen.
So wie hier:

public class TryUndCatchDemo {

	public static void main(String[] args) {
		int dividend = 10;// Dividend erhält den Wert 10
		int divisor = 0;// Divisor mit Wert 0

		try {
			System.out.println(dividend / divisor);// Bildschirmausgabe 10 /0
		} 
		catch (Exception eNull) {
			System.out.println("Division durch 0 ist nicht möglich");
		}
	}
}

Du siehst – durch Polymorphie wird das Exception fangen – eine äußerst facettenreiche und flexibel gestaltbare Geschichte.

Du kannst jede Java Exception auch mit weiteren catch-Block fangen.

Auch das haben wir bereits in einem anderen Beitrag teilweise schon gemacht.

Durch mehrere catch-Blöcke kannst du verschiedene Exception fangen.
Du kannst allerdings auch eine Exception mit mehreren catch-Blöcken fangen.

public class TryUndCatchDemo {

	public static void main(String[] args) {
		int dividend = 10;// Dividend erhält den Wert 10
		int divisor = 0;// Divisor mit Wert 0
		
		try {
			System.out.println(dividend / divisor);// Bildschirmausgabe 10 /0
		} 
		catch (ArithmeticException eArith) {
			System.out.println("Division durch 0 ist nicht möglich");
		}
		catch (RuntimeException eNull) {
			System.out.println("Laufzeitfehler");
		}
		catch (Exception e) {
			System.out.println("Fehler");
		}
	}
}

Durch Polymorphie hast du jetzt aber ganz andere Gestaltungsmöglichkeiten.

Ein zweites Beispiel.

Die IndexOutOfBound Exception fangen.

Diese Ausnahme tritt auf, wenn du ein Array hast.
Und in diesem Array auf ein Fach zugreifen willst, welches größer als die Länge des Arrays ist.
So wie hier:

public class TryUndCatchDemo {

	public static void main(String[] args) {
		int zahlen [] = new int [1];// Array mit Länge 1
		
		try {
			System.out.println(zahlen[10]);//Auslesen des 10-ten Faches
		} 
		catch (ArithmeticException eArith) {
			System.out.println("Division durch 0 ist nicht möglich");
		}
		catch (RuntimeException eNull) {
			System.out.println("Laufzeitfehler");
		}
		catch (Exception e) {
			System.out.println("Fehler");
		}
	}
}

Klick einmal auf „RUN“ und schau, was passiert.
Die Ausnahme wird jetzt durch den zweiten catch-Block gefangen und dort behandelt.

Wieso im zweiten?
Ganz einfach. Die Klasse „IndexOutOfBoundException“ erweitert ebenfalls die Klasse „RuntimeException“.

Java-Exception-fangen-Index-out-of-bound

Somit haben die „ArithmeticException“ und die „IndexOutOfBoundException“ die selbe Superklasse.
Nämlich die Klasse „RuntimeException“.

Das bedeutet für dich.
Du kannst beide Exceptiontypen mit einem Objekt der Klasse „RuntimeException“ abfangen und behandeln.

Die catch Blöcke werden von oben nach unten durchlaufen.

So wie beim switch-case-Statement.

Java Exceptions Fangen

  • Das Programm bemerkt, dass es zur Ausnahme gekommen ist und springt aus dem try-Block.
  • Dann untersucht das Programm den ersten catch-Block.
    Besser gesagt, es prüft – ob das Exceptionobjekt kompatibel ist, zur aufgetretenen Ausnahme.
  • Falls die Ausnahme und dass Objekt kompatibel sind, hakt das Programm dort ein und die Exception wird gefangen.
  • Wenn die Exception nicht zum Objekt des catch-Blockes passt, geht sie zum Nächsten und prüft weiter.
  • Spätestens bei einem Objekt der Superklasse „Exception“ ist Schluss.
    Denn dieses Objekt ist abstrakt und somit kompatibel zu jeder Exceptionart.

Zusammenfassung:

  • Polymorphie besagt, dass du Objekte auch in abstrakteren bzw. allgemeineren Datentypen halten kannst.
    Und dadurch kannst du eine Java Exception auf unterschiedliche Art fangen.
  • Die Catch-Blöcke werden dabei von oben nach unten durchlaufen.
    Und falls das Programm feststellt, dass eine Exception in einen der Blöcke richtig gefangen wird – hakt es dort ein.
  • Da der Datentyp „Exception“ der abstrakteste ist, kannst du jede Exception mit einem Objekt der Klasse Exception fangen.

Ähnliche Beiträge

Java Übung 17: Char-Zeichen mit For-Schleife

Java Übung Char Zeichen For Schleife

In dieser Java Übung werden wir uns die Zeichen des Character Datentypen näher anschauen. Die einzelnen Zeichen sollen auf der Konsole ausgegeben werden. Und wie? Das ganze sollst du mit einer For Schleife machen. Erstelle deshalb eine Klasse „CharZeichen“. In dieser Klasse implementierst du dann eine Klassenmethode, namens „gibZeichen“. Und im Methodenrumpf durchläuft eine For-Schleife […]

Polymorphie bringt Vorteile für Java Arrays

Java Polymorphie Arrays

Wenn Java Arrays, Schubladen oder Container sein sollen… Dann wäre der Gebrauch einer solchen Schublade ziemlich einseitig und festgefahren. Denn in jedes Array passen zwar mehrere Daten – aber immer nur vom gleichen Datentyp. Immer gleicher Datentyp? Also eine Schublade nur für Socken, Unterwäsche und der ganze andere Kram passt dann eben nicht hinein. Um […]

Java Übung: Alles beginnt mit Hello World

Java Übung Hello World

Alles beginnt mit „Hello World“. Sämtliche Java Bücher beginnen mit diesem ersten Beispiel. Auch die Java Übungen sollen mit diesem ersten Programm starten. Definiere eine Klasse „Hello World“. Implementiere die Main Methode. Die Main Methode soll bei Programmaufruf die Bildschirmanzeige „Hallo Welt“ zurückgeben. Die Lösung zur Java Übung „Hallo Welt“ public class HelloWorld{ public static […]

Heap & Stack – Die Speicherverwaltung in Java

Java Speicher

Java nutzt eine interne Speicherverwaltung. Eigentlich sind es mehrere. Uns interessieren lediglich zwei. Da das Thema Speicherverwaltung recht umfangreich ist, habe ich dir im Folgenden einmal die wichtigsten Artikel zusammengestellt. Die zwei Speichersysteme von Java Java Methoden werden auf dem Stack gestapelt. Der Speicher auf dem Java Methoden zu Hause sind, nennt sich Stack Speicher. […]

So unterstützen dich Java Vererbungstabellen beim Entwurf

Java Vererbungstabellen

Bei der Java Vererbung gibt es zwei Klassenarten bzw. -stufen. Die Superklassen, welche einen allgemeinen Typen darstellen Und die spezielleren Unterklassen, welche die Superklasse um bestimmte Funktionen erweitern. Jetzt ist dieses ganze „Der-erbt-von-dem-Konzept“ mitunter sehr schwierig darzustellen. Zum Beispiel in einem Werkzeugkoffer. In einem Werkzeugkoffer befinden sich sämtliche Werkzeuge, von Säge bis Bohrmaschine. Wie machst […]

Sicherer Schleifendurchlauf mit Do while Schleife

Java Do While Schleife

Es ist doch eigentlich so: Immer wenn du die Anzahl der Schleifendurchläufe nicht kennst, nutzt du in deinen Java Programmen while Schleifen. Doch Java bietet dir neben der While Schleife einen weiteren Schleifentyp an. Diese nennt sich do while Schleife. Was kann die? Eigentlich genau das Gleiche, wie die while Schleife. Mit einem kleinen aber […]

Java Übung 27 – Auf zur Mathe-Olympiade

Java Übung Mathe Olympiade

In dieser Java Übung möchte ich mit dir ein Programm erstellen, welches ein Mathematik-Test oder eine Mathe-Olympiade simuliert. Du kennst das vielleicht noch aus der Schule. Matheolympiade- Da wurden aus allen vier Grundrechenarten, Aufgaben formuliert. Die Schüler mussten diese Aufgaben lösen. Die Lehrer kontrollierten die Lösungen. Und der Schüler, welcher die wenigsten Fehler hatte – […]