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

So kannst du Java Arrays anlegen

Java Arrays anlegen

Java Arrays– Was ist das? Stell es dir einmal als ein Bücherregal vor. In einem Bücherregal befinden sich sämtliche Bücher. Und diese befinden sich schön nebeneinander. Jedes Buch hat seinen festen Platz. Du kannst die Bücher ganz genau lokalisieren. Zum Beispiel kannst du sagen. Das erste Buch von links Das dritte von rechts usw. Und […]

So kannst du Java Konstruktoren anlegen und überladen

Java Konstruktoren

Der Name sagt es schon. Java Konstruktoren konstruieren oder bauen Java Objekte. Und diese Objekte baut der Konstruktor auf Vorlage der entsprechenden Java Klasse. In diesem Beitrag zeige ich dir natürlich verschiedene Ansätze wie du den Konstruktor einsetzt. Ich zeige dir dies Schritt für Schritt. Dabei zeige ich dir auch verschiedene Dinge, welche nicht funktionieren. […]

Ohne Abstraktion ergibt Java Polymorphie wenig Sinn

Java Polymorphie Abstraktionsprinzip

Kennst du den Film Matrix? Denn kennst du vielleicht auch die Botschaft, welche der Protagonist am Anfang des Filmes erhält. „Folge dem weißen Kaninchen.“ Und so ähnlich ist es jetzt auch in diesem Beitrag. „Wir dringen immer tiefer in den Kaninchenbau ein.“ 🙂 Ganz so wie im Film wird es nicht. Aber bevor wir mit […]

Achte bei Java Methoden stets auf die Wertübergabe

Java Methoden Wertübergabe

Ich lege gleich los…. Schau dir diesen Code einmal an. Welche Zahl wird wohl auf der Bildschirmanzeige zurückgegeben? public class MethodenWertUebergabe { static int verdoppele (int i){ i=i*2; return i; } public static void main(String[] args) { int i = 2; verdoppele(i); System.out.println(i); } }

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 […]

So kannst du Java Methoden überladen

Java Methoden überladen

Im Mittelalter war es üblich, dass Könige oder Adlige Briefe durch ein Siegel verschlossen. Das Siegel hatte die Aufgabe den Inhalt des Briefes vor dem gewaltsamen Öffnen zu schützen. Außerdem hatte das Siegel die Aufgabe einen Eigentumsnachweis sicher zu stellen. Und jeder, welcher das Siegel des Königs sah, wusste: „Das königliche Siegel – Oh ein […]

Java Vererbung findet auch zwischen Einkaufstüten und Polizeiautos statt

Java Vererbung

„Manchmal findet Java Vererbung auch zwischen Einkaufstüten und Polizeiautos statt“ Irrer Titel, oder? Aber mal Hand aufs Herz. Was haben eigentlich eine Einkaufstüte und ein Polizeiwagen gemeinsam? Ich verrate dir etwas: Du kannst die Verbindung nicht erkennen, denn ich habe dir nicht alles verraten. Es fehlt noch ein wichtiger Aspekt – eine Verbindung zwischen beiden. […]

Drei Möglichkeiten um Java Objekte zu zerstören

Java Objekte zerstören

Java Objekte leben genau solange, wie eine Referenzvariable auf sie zeigt. Wenn dieser Zeiger nicht mehr existiert, wird dieses Objekt aufgeben. Und wenn dieses Objekt erst einmal aufgegeben wurde, dann kommt der Garbage Collector und entsorgt dieses. Aber wie kannst du nun am Sinnvollsten Objekte aufgeben? Lass es uns herausfinden.

Hier sind ein paar richtig nette Features, die dich beim Java lernen unterstützen

Java lernen Eclipse

Was ist das Wichtigste beim Einstieg in ein neues Wissensgebiet? Nein, kein gutes Sachbuch oder ein besonders guter Lehrer. Es ist Spaß. Beim Java Lernen brauchst du Spaß. Es gibt Lehrer, welche ihren Stoff so vermitteln, dass Lernen Spaß bereitet. Aber die Grundvoraussetzung ist und bleibt der Spaß. Und nichts ist so spaßhemmend wie Langeweile […]