Professionelle Java-Schulung – Vor Ort und Online.

  • Einführung in die Welt der Java-Programmierung
  • Konzepte und Techniken von Algorithmen kennenlernen
  • Datenbanken und ihren Einsatz in der digitalen Welt

Ausnahmebehandlung mit Exceptions



In Java sind Exceptions (Ausnahmen) ein Mechanismus, der verwendet wird, um Fehler oder unerwartete Ereignisse während der Laufzeit einer Java-Anwendung zu behandeln. Wenn ein Fehler oder eine Ausnahme auftritt, unterbricht es normalerweise den normalen Ausführungsfluss des Programms und führt zu einem vorzeitigen Abbruch. Exceptions ermöglichen es jedoch, solche Fehler elegant zu behandeln, indem sie sie an den aufrufenden Code zurückgeben, der dann entsprechende Maßnahmen ergreifen kann.

In Java sind alle Exceptions Instanzen von Klassen, die von der Basisklasse `java.lang.Exception` oder `java.lang.RuntimeException` (oder deren Unterklassen) abgeleitet sind. Es gibt zwei Haupttypen von Exceptions in Java:

1. Checked Exceptions (Überprüfte Ausnahmen): Checked Exceptions sind Ausnahmen, die zur Kompilierzeit vom Compiler erkannt und behandelt werden müssen. Dies bedeutet, dass der Code, der eine Methode aufruft, die eine checked Exception wirft, entweder die Ausnahme abfangen (mit einem try-catch-Block) oder selbst als Methode, die eine checked Exception wirft, deklariert werden muss (mit dem `throws`-Klausel in der Methodendeklaration).

Beispiel für eine checked Exception:


import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
  File file = new File("sample.txt");

  try {
    Scanner scanner = new Scanner(file);
    while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    System.out.println(line);
  }
  scanner.close();
  } catch (FileNotFoundException e) {
    System.out.println("Datei nicht gefunden: " + e.getMessage());
    }
  }
}

2. Unchecked Exceptions (Unchecked oder Runtime Ausnahmen): Unchecked Exceptions (auch bekannt als Runtime Exceptions) sind Ausnahmen, die zur Laufzeit auftreten und nicht zur Kompilierzeit behandelt werden müssen. Der Compiler erzwingt nicht, dass sie abgefangen oder deklariert werden, was es Entwicklern ermöglicht, ihre Anwendungslogik zu vereinfachen. Unchecked Exceptions treten normalerweise aufgrund von Fehlern in der Programmlogik auf und können durch sorgfältiges Programmieren und Tests vermieden werden. Beispiel für eine unchecked Exception:


public class Main {
public static void main(String[] args) {
  int dividend = 10;
  int divisor = 0;

  // Division durch 0 führt zu einer ArithmeticException (Unchecked Exception)
  int result = dividend / divisor;
    System.out.println("Ergebnis: " + result);
  }
}

Es ist wichtig, Exceptions sorgfältig zu behandeln, um zu verhindern, dass Anwendungen unerwartet abstürzen und um Fehlerzustände ordnungsgemäß zu verarbeiten. Exceptions ermöglichen eine robustere und fehlertolerante Softwareentwicklung, indem sie den Entwicklern eine Möglichkeit bieten, auf außergewöhnliche Situationen zu reagieren und alternative Flusssteuerungspfade einzurichten.

Finally-Block:

Der Finally-Block wird immer ausgeführt, unabhängig davon, ob eine Exception aufgetreten ist oder nicht. Er wird normalerweise verwendet, um Cleanup-Arbeiten durchzuführen, wie das Schließen von Dateien oder Verbindungen, unabhängig davon, ob ein Fehler aufgetreten ist oder nicht.


public class Main {
public static void main(String[] args) {
  int dividend = 10;
  int divisor = 0;

  try {
    int result = dividend / divisor;
    System.out.println("Ergebnis: " + result);
    } catch (ArithmeticException e) {
      System.out.println("Ein Fehler ist aufgetreten: " + e.getMessage());
    } finally {
           System.out.println("Wird immer ausgeführt");
      }
  }
}

Throws-Klausel:

In Fällen, in denen Sie die Exception nicht direkt behandeln können oder möchten, können Sie die throws-Klausel in der Methodendefinition verwenden, um die Exception an den aufrufenden Code weiterzugeben.


public class Main {
    public static void main(String[] args) {
        try {
            doSomething();
        } catch (IOException e) {
            System.out.println("Ein Fehler ist aufgetreten: " + e.getMessage());
            // Weitere Maßnahmen, um mit dem Fehler umzugehen
        }
    }

    public static void doSomething() throws IOException {
        // Code, der eine IOException auslösen kann
        throw new IOException("Dies ist eine Test-Exception.");
    }
}


Eigene Exceptions:

Sie können auch eigene Exception-Klassen erstellen, die von Exception oder RuntimeException abgeleitet sind, um benutzerdefinierte Fehlerzustände in Ihrer Anwendung darzustellen und zu behandeln.


class MyCustomException extends Exception {
    public MyCustomException(String message) {
        super(message);
    }
}

public class Main {
    public static void main(String[] args) {
        try {
            throw new MyCustomException("Benutzerdefinierte Exception aufgetreten.");
        } catch (MyCustomException e) {
            System.out.println("Fehler: " + e.getMessage());
        }
    }
}


Aufgabe