Skip to main content

So verwendest du in Java try und catch Blöcke

Ich bereue lieber die Dinge, die ich getan habe – als die Dinge, welche ich gar nicht erst versucht habe.

Ja ich würde mich als den typischen „try-and-error-Menschen“ bezeichnen.
Was ich will, probiere ich einfach aus und schaue dann erst was passiert.

So etwas wie Pläne kenne ich eigentlich nicht.
Und wenn ich mal einen Plan zu einer bestimmten Idee oder einem Projekt hatte, bin ich gnadenlos damit gescheitert.

Ich musste erkennen, ich bin kein Planer oder Planmensch.

Natürlich ist nicht immer alles vom Erfolg gekrönt.
Aber spätestens seit dem Buch „Gegen den Schwarm“ von Matthias Kolbusa, weiß ich:

„Niederlagen sind wertvoller als Siege.“

Denn in jeder Niederlage steckt enormes Wachstums- und Lernpotential.
Somit begrüße ich auch Niederlagen, als erheblich wertvollen Teil des Gesamterfolges.

Das Java try und catch Prinzip setzt eigentlich auch beim einfachen Ausprobieren an.
Das Programm probiert einen Codeblock aus und falls es zu einer Ausnahme kommt – wird diese gefangen bzw. abgefangen.

Doch lass mich dies am Beispiel zeigen.

Den Java Try und catch Block am Beispiel einer einfachen Mathematikaufgabe.

Dies ist der Klassiker – die Division durch Null.
Ich hatte dieses Beispiel auch schon einmal in einem anderen Beitrag zur Exception-Einführung aufgenommen.
Dieser Beitrag soll tiefer in die Materie eindringen.
Denn diesmal sollen mehrere unterschiedliche Ausnahmen behandelt werden.

Für diesen Beitrag habe ich eine neue Klasse, namens „TryUndCatchDemo“, angelegt.
Da ich das Programm gleich aus dieser Klasse heraus starten möchte, habe ich die main-Methode implementiert.

public class TryUndCatchDemo {

	public static void main(String[] args) {

	}
}

Jetzt bekommt die Klasse noch zwei schicke lokale Variable vom Datentyp Integer.
Und zwar einmal den Dividenden und zum anderen den Divisor.

public class TryUndCatchDemo {

	public static void main(String[] args) {
		int dividend;//Dividend vom Datentypen Integer
		int divisor;//Divisor vom Datentypen Integer
		
	}
}

Beim Programmstart soll eine Bildschirmausgabe erfolgen, welche mir das Ergebnis aus Dividend/Divisor zurückgibt.

public class TryUndCatchDemo {

	public static void main(String[] args) {
		int dividend;
		int divisor;
		
		System.out.println(dividend / divisor );//Bildschirmausgabe liefert Ergebnis der Division
	}
}

Falls du dieses Beispiel bis hierher selbst vollzogen hast….
Dann siehst du sicherlich die Fehlermeldung am linken Rand.

Java Try und Catch am Beispiel

Da lokale Variablen immer initialisiert sein müssen, musst du beiden Variablen jeweils einen Wert zuweisen.

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
		
		System.out.println(dividend / divisor );//Bildschirmausgabe: Ergebnis aus 10 geteilt durch 0
	}
}

Also dann…
Die Division durch Null ist nicht möglich.
In der Mathematik würde man so eine Aufgabe als nicht lösbar bezeichnen.

Und auch Java gibt dir bei diesem Code – eine Exception zurück.
Klicke einmal auf „RUN“ und probiere dieses kleine Programm einmal selbst aus.


Java-Try-und-Catch-Division-durch-0-Exception

Wie erwartet – kam es zur Exception.
Unten in der Ausgabekonsole – kannst du nachlesen, um was für eine Exception es sich genau handelt.
In diesem Fall ist es eine „java.lang.ArithmeticException“.

Also….
Falls du irgendwann einmal diese Ausnahmemeldung liest, weißt du irgendwo wurde durch 0 dividiert.

Jetzt lass uns diese Exception einmal fangen.

Fangen hört sich niedlich an, oder?
Aber genauso ist die Bezeichnung.

Exceptions oder Ausnahmen werden gefangen bzw. abgefangen.
Und zwar mit dem Java Keywort catch.

Dazu wird ein sogenannter Catch-Block in der Methode angelegt.
So wie hier auf dem Bild.


Java Catch Block

  • Der weiße Block ist die Klasse – begrenzt durch zwei geschweifte Klammern.
  • Innerhalb der Klasse befindet sich die main-Methode.
    In diesem Bild ist diese blau und wird ebenfalls durch zwei Klammern begrenzt.
  • Und innerhalb der main-Methode platzierst du deinen Catch-Block.
    In diesem Bild ist dieser Lila dargestellt.

Also dann:

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

		System.out.println(dividend / divisor);// Bildschirmausgabe 10 /0
													
		 catch (ArithmeticException eNull) {
			System.out.println("Division durch 0 ist nicht möglich");
		}
	}
}
  • Zuerst das Keywort catch.
  • Dann in die Klammern ein Objekt der Klasse „ArithmeticException“.
    Ich nenne diese eNull – für Division durch Null.
  • Und dann eine Anweisung, welche ausgeführt werden soll – sobald die Exception gefangen wurde.
    Hier kannst du sämtliche Programmlogik platzieren – zB. If-else Konstrukte anlegen, Schleifen durchlaufen oder neue Methodenaufrufe implementieren.
  • In diesem Beispiel kommt es zu einer einfachen Bildschirmausgabe.
    Und zwar: „Division durch 0 ist nicht möglich.“

Soweit – so gut.
Dennoch fehlt jetzt noch der Try-Block.
Ich sagte ja bereits:

„Das Java try und catch Prinzip besteht aus Ausprobieren und Abfangen.“

Der Try Block umschließt den ganz normalen Code, welcher ausgeführt werden soll.

Also all das, was dein Java Programm probieren soll.

Und ausprobieren soll es – die Division durch Null.
Also packst du den Try-Block um die Bildschirmausgabe mit der Division.
So wie hier im Bild.

Java-Try-und-Catch-Blöcke

  • Auch dieser try Block beginnt mit einem Java Keywort try.
  • Dann folgt die öffnende Klammer.
  • Und im Code-Block packst du alles rein, was normalerweise ausgeführt werden soll.
  • Die schließende Klammer kennzeichnet dann das Ende des try-Blockes.

Hier der Code zum Mitschreiben:

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");
		}
	}
}

Probiere auch dieses Programm einmal aus.
Und läuft?
Die Division durch Null wird somit abgefangen.

Lass uns dieses Programm erweitern.

Und zwar durch eine Bildschirmeingabe.
Denn die Zahlen sollen nicht vorbelegt sein.

Stattdessen soll dich das Programm zur Eingabe bestimmter Zahlen auffordern.
Und dann werden diese automatisch mit einander verrechnet und das Ergebnis als Bildschirmausgabe präsentiert.

Die Eingabe der Zahlen machst du mit einem Scanner-Objekt.

Dazu legst du zwei neue Scannerobjekte an, welche die Eingabe für den Dividenden und Divisor speichern sollen.

import java.util.Scanner;//Importanweisung für den Scanner

public class TryUndCatchDemo {

	public static void main(String[] args) {
		Scanner scanDividend = new Scanner (System.in);//Neues Scannerobjekt speichert den Dividend
		Scanner scanDivisor = new Scanner (System.in);//Neues Scannerobjekt speichert den Divisor
		
		int dividend = scanDividend.nextInt();//Speichert die Bildschirmeingabe zum Dividenden 
		int divisor = scanDividend.nextInt();//Speichert den Divisor in die Variable

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

Dazu noch die jeweilige Aufforderung zur Eingabe.
Somit weißt du zur Laufzeit des Programmes auch, welche Werte du gerade eingibst.

import java.util.Scanner;//Importanweisung für den Scanner

public class TryUndCatchDemo {

	public static void main(String[] args) {
		Scanner scanDividend = new Scanner (System.in);//Neues Scannerobjekt speichert den Dividend
		Scanner scanDivisor = new Scanner (System.in);//Neues Scannerobjekt speichert den Divisor
		
		System.out.println("Dividend:");//Eingabeaufforderung für den Dividenden
		int dividend = scanDividend.nextInt();//Speichert die Bildschirmeingabe zum Dividenden 
		System.out.println("Divisor:");//Eingabeaufforderung für den Divisor
		int divisor = scanDividend.nextInt();//Speichert den Divisor in die Variable

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

Und schick?
Probiere es aus!
Gib zwei beliebige Zahlen, wie beispielsweise 10 und 2 ein.
Es wird ein ganzzahliges Ergebnis zurückgegeben.

Java Try und Catch Mathematikaufgabe

Probiere einmal, in einem zweiten Durchlauf, die 0 als Divisor aus!
Und klappt auch.
Keine Exception, oder?
Stattdessen bekommst du die Fehlermeldung angezeigt, welche im Catch-Block vereinbart wurde.

So und jetzt – probiere einmal aus – die Null einzugeben.
Nein, nicht die Zahl 0.
Schreibe das Wort: Null.

Java Try und Catch Exceptions fangen

Boah, neue Exception.

Du musst jede Exceptionsart einzeln fangen.

Und jede will einen einzelnen catch-Block für sich haben.
So ist das mit den Ausnahmen. Sie sind eitel. 🙂

Also dann.
Die Eingabe eines Textwertes bzw. Strings verursachte eine „InputMismatchException“.

Java-try-und-catch-InputMismatchException

Dann lass uns diese Exception einmal separat behandeln.

Und das ist jetzt ganz einfach.
Denn du benötigst lediglich einen neuen catch-Block.

  • In den Klammern legst du eine neue Variable vom Datentyp InputMismatchException an.
  • Die Klasse „InputMismatchException“ musst du über die Importanweisung importieren.
  • Dann noch die Logik, was passieren soll – falls diese Ausnahme auftritt.
  • Fertig.
import java.util.InputMismatchException;//Importanweisung der InputMismatch Exception
import java.util.Scanner;//Importanweisung für den Scanner

public class TryUndCatchDemo {

	public static void main(String[] args) {
		Scanner scanDividend = new Scanner (System.in);//Neues Scannerobjekt speichert den Dividend
		Scanner scanDivisor = new Scanner (System.in);//Neues Scannerobjekt speichert den Divisor
		
		System.out.println("Dividend:");//Eingabeaufforderung für den Dividenden
		int dividend = scanDividend.nextInt();//Speichert die Bildschirmeingabe zum Dividenden 
		System.out.println("Divisor:");//Eingabeaufforderung für den Divisor
		int divisor = scanDividend.nextInt();//Speichert den Divisor in die Variable

		try {
			System.out.println(dividend / divisor);// Bildschirmausgabe des Ergebnisses
		} 
		catch (ArithmeticException eNull) {
			System.out.println("Division durch 0 ist nicht möglich");
		}
		catch (InputMismatchException eText){
			System.out.println("Du musst eine echte Zahl eingeben!");
		}
	}
}

Klicke auf „RUN“ und schau was passiert.
Und läuft, oder?

Probiere es wirklich selbst aus.
Kopiere den Code und klicke auf „Ausführen“.

Java try und catch Exception Handling

Hier im Bild ist wirklich nur der Ausschnitt zu sehen.
Die Exception wurde gecatcht bzw. gefangen.
Dennoch kommt es zur Exception.

Was ist falsch gelaufen?
Ich gebe dir einen Tipp. 🙂
Schau dir einmal den Code an. Wo und wann tritt die Exception auf?
Das heißt an welcher Stelle im Code kommt es eigentlich zur Ausnahme.

Wenn du dies herausgefunden hast….
Dann schau mal auf den try-Block.
Umfasst der diesen Code oder nicht?

Hier der Code-Ausschnitt zur Veranschaulichung.

Java try und catch Mismatch Exceptions Fehlerbehandlung

  • Die erste Ausnahme, die „ArithmeticException“, entsteht bei der Division durch Null.
    Somit bei der Berechnung.
  • Diese liegt im try-Block und kann somit ordentlich abgefangen werden.
  • Die zweite Ausnahme – die Eingabe von Text statt einer Zahl – liegt aber ganz woanders.
  • Und zwar bei der Speicherung und Verarbeitung der beiden Integervariablen.
    Dieser Codebereich liegt aber noch nicht im try-Block.

Also muss dieser dort hinein.
Das bedeutet jetzt:
Verschiebe den try-Block nach oben.
Soweit, dass auch die Eingaben innerhalb des Blockes liegen.

Hier der komplette Code dazu:

import java.util.InputMismatchException;//Importanweisung der Exception
import java.util.Scanner;//Importanweisung für den Scanner

public class TryUndCatchDemo {

	public static void main(String[] args) {
		Scanner scanDividend = new Scanner(System.in);// Neues Scannerobjekt
		Scanner scanDivisor = new Scanner(System.in);// Neues Scannerobjekt

		try {
			System.out.println("Dividend:");// Eingabeaufforderung
			int dividend = scanDividend.nextInt();// Speichert Dividend
			System.out.println("Divisor:");// Eingabeaufforderung
			int divisor = scanDividend.nextInt();// Speichert den Divisor
			System.out.println(dividend / divisor);//Ergebnisrückgabe
		} 
		catch (ArithmeticException eNull) {
			System.out.println("Division durch 0 ist nicht möglich");
		} 
		catch (InputMismatchException eText) {
			System.out.println("Du musst eine echte Zahl eingeben!");
		}
	}
}

So das war’s.
Jetzt fängst du beide Exceptions ab.
Selbst wenn du als Dividend einen Text eingibst, wird diese Ausnahme behandelt.

Zusammenfassung:

  • Mit Java try und catch Blöcken, lassen sich Ausnahmen abfangen.
  • Dadurch ist es dir möglich auf unterschiedliche Ausnahmearten zu reagieren.
  • In jedem catch-Block kannst du für jeden Ausnahmentypen eine separate Logik anlegen.
    Dabei hast du sämtliche Möglichkeiten, wie Schleifen oder Methodenaufrufe.

Ähnliche Beiträge

Java Vererbung – Die Hierarchien richtig planen

Java Vererbung Hierarchien

Java Vererbung hat nichts mit Biologie zu tun. Die Genetik besagt, dass bestimmte Merkmalsausprägungen von den Eltern auf die Kinder übergehen. Solche Merkmalsausprägungen sind: die Hautfarbe die Haarfarbe die spezifische Größe und weitere körperliche Merkmale. Und in Java – was ist da Vererbung? Lass es uns herausfinden. Was erwartet dich in diesem Beitrag? Zuerst schauen […]

So einfach lassen sich Java Strings umkehren

Java Strings umkehren

Kennst du noch das Lied „ANNA“ von Freundeskreis? Da hieß es: Du bist von hinten, wie von vorne A-N-N-A. Solche Namen oder Wörter, welche von hinten nach vorne gelesen – die gleiche Bedeutung haben, nennt man Palindrome. Anna, Ehe oder Ebbe sind recht kurze Palindrome. Aber auch längere zusammengesetzte Palindrome kennt die deutsche Sprache: Regallager […]

So nutzt du Methoden aus der Java String Klasse

Java Strings Methoden

In einen der letzten Beiträge haben wir darüber gesprochen, dass Java Strings – Objekte sind. Dass Strings in allen Programmen äußerst häufig vorkommen Und dass sich deshalb Referenzvariablen String-Objekte im String Pool teilen. Das Konzept hinter dem String-Pool ist die Teilung der Ressourcen. Und das bedeutet: Weniger Objekte – mehr Speicher Mehr Speicher – bessere […]

Java Konsolenausgaben mit formatierten Zahlen

Java Konsolenausgaben Zahlen

Java Konsolenausgaben erzeugst du mit der System.out.println()-Anweisung. Dies ist relativ einfach. Aber es ist mitunter nicht ganz praktisch. Und zwar immer dann, wenn Zahlen im Spiel sind. Die Zahlen welche dann auf deiner Java Konsole erscheinen, sind unformatiert. Sie haben zu viele Kommastellen. Oder für eine bessere Darstellung benötigst du den Tausenderpunkt. Vielleicht möchtest du […]

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

Nutze das Java Switch Case Statement für komplexe Verzweigungen

Java Switch case

Java switch case statement – was ist das? Wozu brauchst du das? Lass mich anders beginnen… 🙂 In einen meiner früheren Beiträge habe ich schon einmal über bedingte Anweisungen oder Zuweisungen geschrieben. Diese if und else Konstrukte funktionieren eigentlich ganz gut. Aber was ist, wenn du mehrere Parameter abfangen möchtest. Okay ein Beispiel…

Die vier wichtigen Phasen um Java Objekte zu erstellen

Java Objekte anlegen

Wie werden aus deinen Java Klassen richtig nützliche Java Objekte? Das ganze läuft in vier Phasen ab. Und diese Phasen möchte ich dir in diesem Beitrag vorstellen. Ob das nützlich ist? Schau dir das Bild an. Am Ende dieses Beitrages wirst du wissen, warum Eclipse dir hier eine Fehlermeldung gibt und wie du dieses Problem […]

So nutzt du getter und setter Methoden bei der Java Programmierung

Java Keyword private

In diesem Artikel möchte ich dir zeigen, wie du Instanzvariablen innerhalb der Java Klasse schützt. Und den Zugriff nur noch indirekt über getter und setter Methoden anbietest. Stell dir vor. Du hast ein Programm zur Lagerverwaltung geschrieben. Dieses Programm dient Möbelhäusern dazu, ihre Bestände zu verwalten. Und das Programm erwartet vom Nutzer gewisse Eingaben zu […]

Java Übung 24 – So kannst du Kommazahlen runden

Java Übung runden

In dieser Java Übung möchte ich mit dir Zahlen runden. Ich bitte dich deshalb: Erstelle eine Klasse „RundenUebung“. Lege dann eine statische Methode rundeZahl() an. Diese erwartet zwei Parameter. Parameter 1 ist die Kommazahl, welche gerundet werden soll. Als zweiten Parameter wird eine ganze Zahl übergeben, welche die Nachkommastelle – bis auf welche letztlich gerundet […]