Heute widme ich mich folgender Fragestellung:
- Wie funktioniert Try/Catch in Java?
- Try und Catch Blöcke in Java
- Exceptions mit Try und Catch in Java
- Tutorial Try-Catch in Java
- Try Catch Finally Java
- Beispiel Try Catch Java
Das Try-Catch Kommando umschliesst einen Codeabschnitt und wird dafür verwendet mögliche Fehler (exceptions) innerhalb dieses Codeabschnittes abzufangen, sodass man darauf reagieren kann. Folgend ist die generelle Syntax dargestellt:
try { // code der gesichert laeuft } catch (ExceptionKlassenname variablenname) { // Fehlerbehandlung }
Die Try-Catch Anweisung besteht aus vier Teilen. Der Block der von “try” eingeschloßen wird läuft gesichert ab kann möglicher Weise die Exception werfen die wir abfangen wollen. Die Fehlerbehandlung findet innerhalb des Catch-blockes statt. Der Exception Klassenname beschreibt den Fehler auf den wir reagieren wollen. Der Variablenname benennt die Exception innerhalb des Catch-blockes, sodass entsprechend der Exception innerhalb des Catch-blockes reagiert werden kann.
Wenn die abgefangene Exception innerhalb des Try-blockes geworfen wird, so springt die Codeausführung direkt in den Catch-Block. Wenn die Exception nicht geworfen wird, wird der Catch-block nie aufgerufen.
Hier ist ein Beispiel eines Programs, das versucht eine Datei in einem nichtexistierenden Verzeichnis zu erstellen und daher eine IOException wirft.
String filename = "/nichtExistierendesVerzeichnis/meinDateinname"; try { // Erstelle die Datei new File(filename).createNewFile(); } catch (IOException e) { // Gib die Fehlermeldung aus die aufgetreten ist System.out.println("Konnte die Datei "+filename+ " nicht erstellen:\n"+e.getMessage()); } // Ausführung des Programmes wird hier fortgesetzt.
Hier ist die Ausgabe:
Konnte die Datei /nichtExistierendesVerzeichnis/meinDateinname nicht erstellen:
The system cannot find the path specified
Es ist möglich mehr als einen Exception Handler zu definieren. Die Enception Handler werden von oben nach unten abgearbeitet. Wenn eine Exception auftritt, wird jeder Exception-Handler von oben nach unten überprüft ob er für die Exception zuständig ist. Der erste zutreffende Handler wird ausgeführt.
Das folgende Beispiel registriert einen Namen in einer Website. Der Beispielcode can zwei Arten von Exceptions werfen: eine wenn die URL invalide ist (MalformedURLException) und eine andere wenn auf die Webpage nicht zugegriffen werden kann. Das Beispiel verwendet eine ungültige URL, sodass eine MalformedURLException geworfen wird.
// in dieser URL wurde absichtlich das http weggelassen String urlStr = "schabby.de:80/register=johannes"; try { // lade von URL URL url = new URL(urlStr); InputStream is = url.openStream(); is.close(); } catch (MalformedURLException e) { // gib Fehlermeldung aus System.out.println("Fehlerhafte URL "+urlStr+": "+e.getMessage()); } catch (IOException e) { // Gib Fehlermeldung aus System.out.println("konnte "+urlStr+" nicht oeffnen: "+e.getMessage()); }
Hier ist die Ausgabe des Programs:
Fehlerhafte URL Invalid URL schabby.de:80/register=johannes: no protocol: schabby.de:80/register=johannes
Folgende ist das selbe Beispiel mit korrekter URL angegeben. Die URL zeigt jedoch auf eine nichtexistierende Webseite, sodass dieses Mal eine IOException geworfen wird.
urlStr = "http://schabby-gnagnagnang.de:80/register=johannes"; try { // lade von URL URL url = new URL(urlStr); InputStream is = url.openStream(); is.close(); } catch (MalformedURLException e) { // gib Fehlermeldung aus System.out.println("Fehlerhafte URL "+urlStr+": "+e.getMessage()); } catch (IOException e) { // Gib Fehlermeldung aus System.out.println("konnte "+urlStr+" nicht oeffnen: "+e.getMessage()); }
Das Program gibt folgenden Output:
konnte http://schabby-gnagnagnang.de:80/register=johannes nicht oeffnen: Connection refused: connect
Wenn eine Exception auftritt, wird sie mit allen angegebenen Exceptions in den Catch-blöcken mit Hilfe des instanceof Operators verglichen. Das bedeutet, wenn ein Handler für eine Exceptionklasse E angegeben wird, wird jede Exception die entweder vom Typ E ist oder eine Subklasse von E ist gehandelt.
Im folgenden Beispiel werden beide Exceptiontypen (MalformedURLException und IOException) unter der Oberklasse Exception vereinheitlicht und gehandelt.
urlStr = "http://schabby-gnagnagnang.de:80/register=johannes";
try {
// lade von URL
URL url = new URL(urlStr);
InputStream is = url.openStream();
is.close();
} catch (Exception e) {
// gib die Fehlermeldung aus
System.out.println("problem beim laden von "+urlStr+": "+e.getMessage());
}Hier ist die Ausgabe:
problem beim laden von http://schabby-gnagnagnang.de:80/register=johannes: Connection refused: connect
Wenn eine Exception auftritt die keinen passenden Handler hat, wird die Exception im Funktionsaufruffluss nach oben gereicht bis sie in einem entsprechenden try-catch Block abgefangen wird. Wenn kein try-catch Block zutrifft, schlägt die Exception bis auf die obererste Funktionseben durch und beendet den Thread in dem die Exception aufgetreten ist.
Im folgenden Beispiel provozieren wir eine Nullpointerexception die das Program zu absturz bringt da wir sie nicht in einem catch-block abfangen. Man spricht in solch einem Fall auch von einer uncaught Exception.
// setze string to null um Nullpointerexception zu provozieren urlStr = null; try { int len = urlStr.length(); // verursacht Nullpointerexception URL url = new URL(urlStr); } catch (MalformedURLException e) { // gib Fehlermeldung aus System.out.println("Fehlerhafte URL "+urlStr+": "+e.getMessage()); }
Das Ergbnis ist eine uncaught exception die das Program zum absturz bringt. Netter Weise gibt Java den Stacktrace aus, sodass man nachvollziehen kann wo der Fehler auftrat.
Exception in thread "main" java.lang.NullPointerException
at MeineKlasse.meineMethode(MeineKlasse.java:162)
Try-Catch Finally
Das nächste Level wollen wir dem Verständnis des finally Blocks erklimmen. Der finally Block wird einfach an das Ende der Try-Catch Blöcke gehängt. Seine Semantik ist einfach: Der finally Block wird IMMER ausgeführt, ganz egal ob im Try-Block eine Exception geworfen wurde oder nicht. Im Outline sieht das so aus:
try { // code der gesichert laeuft } catch (ExceptionKlassenname variablenname) { // Fehlerbehandlung } finally { // wird in jedem Fall ausgeführt }
Das finally-Block ist inbesondere dann sinnvoll, wenn man einen Ursprungszustand wieder herstellen oder aufräumen muss. So eignet sich z.B. der finally Block sehr gut um Datein wieder zu schließen oder Sockets zu droppen.

Hi there would you mind stating which blog platform you’re working with? I’m going to start my own blog in the near future but I’m having a difficult time selecting between BlogEngine/Wordpress/B2evolution and Drupal. The reason I ask is because your design seems different then most blogs and I’m looking for something unique. P.S Apologies for being off-topic but I had to ask!
Hi, I am using the classical WordPress. If you inspect the HTML, you find the line which reveals as well that I am using common WordPress.