Exceptions abfangen


try{
	int ergebnis = 1 / 0;
}catch(Exception e){
	System.err.println(e.getLocalizedMessage());
}finally { 
	System.out.println("Programm fertig."); 
}

Wenn im try Block ein Fehler auftritt, wird der Code abgebrochen und die Exception als e an den catch Block übergeben und dort wird der Code weiter ausgeführt. Der finally Block wird ohne Ausnahme immer ausgeführt

Verschiedene Arten von Exceptions


Es gibt viele verschiedene Klassen in Java von Exceptions. Es können im catch Block verschiedene Arten von Exceptions abgefangen werden. Die letzte catch Anweisung sollte immer Exception abfangen um aller nicht vorher genannten Fehlertypen abzufangen.

try { 
	int ergebnis = 1 / input;
} catch (ArithmeticException e1) { 
	System.err.println("Division durch Null!"); 
} catch (InputMismatchException e2) { 
	System.err.println("Das ist keine ganze Zahl."); 
} catch (Exception e3) { 
	System.out.println("Fehler: " + e3.getLocalizedMessage());
}

Es können auch verschiedene Fehler in eine catch Block abgefangen werden

try { 
	int ergebnis = 1 / input;
} catch (ArithmeticException | InputMismatchException e1) { 
	System.out.println("Fehler: " + e3.getLocalizedMessage());
}

Try mit Ressourcen


try(PrintWriter ressource = new PrintWriter("D:/Ausgabedatei.txt")){
	out.println("Test2"); 
} catch (FileNotFoundException ex) {
	// ... Fehlermeldung ...
}

Das geht mit allen Klassen die AutoClosable implementieren

Beispiel


private static Scanner scan = new Scanner(System.in); // Scanner initialisieren
    
    public static int einlesen() { //Funktion zum Einlesen einer Ganzzahl
        int zahl = 0;
        try {
            zahl = Integer.parseInt(scan.nextLine()); // Einlesen
        } catch (NumberFormatException e) {
            System.out.println("Keine gültige Zahl " + e.getLocalizedMessage());
            zahl = einlesen(); //Funktion neu aufrufen
        }
        return zahl;
    }
 
    public static void main(String[] args) {
        System.out.println("Dividend:");
        int dividend = einlesen();
        System.out.println("Divisor:");
        int divisor = einlesen();
        
        int ergebnis = 0;
        int rest = 0;
        
        try{
            ergebnis = dividend / divisor; //Berechnen
            rest = dividend % divisor; //Rest berechnen
            //Das Ergebnis wird nur ausgegeben wenn kein Fehler geworfen wurde
            System.out.println("Erg: " + ergebnis + " Rest: " + rest);
        }catch(Exception e){
            System.out.println("Fehler bei der Rechenoperation"  + e.getLocalizedMessage());
        }
    }

Fehler werfen


In Klassen ist es häufig sinnvoller Fehler zu werfen als sie zu behandeln:

public class MyClass{
	public static int myFunc(int n){
		if(n >= 10){
			throw new IndexOutOfBoundsException("Zahl zu hoch!");
		}
		return n;
	}
}
 
void main(){
	try{
		MyClass.myFunc(11);
	}catch(IndexOutOfBoundsException e){
		System.err.println(e.getMessage())
	}
}

Eigene Fehlerklassen


Für eine eigene Fehlerklasse muss man von der Klasse Exception oder einer ihrer Unterklassen erben.

public class CheckedLengthException extends Exception { 
	public CheckedLengthException() { 
		super("Der Text ist zu lang!");
	}
}

Eigene Exceptions


Checked Exceptions

Checked Exceptions erben von Exceptions. Wird hier die Fehlerbehandlung weggelassen kann der Code nicht compiliert werden

Eigene Fehlerklasse

public class CheckedLengthException extends Exception { 
	public CheckedLengthException() { 
		super("Der Text ist zu lang!"); 
	} 
}

Erzeugen eines Exception Objektes (Werfen eines Fehlers)

Wo Checked Exceptions geworfen werden muss <method> throws <MyException> dabei sein

public void check(String input, int maxLength) throws CheckedLengthException { 
	if (input.length > maxLength) { 
		throw new CheckedLengthException(); 
	} 
}

Unchecked Exceptions

Fehlerklassen, die von der Klasse RuntimeException erben Hier kann der Code auch kompiliert werden, wenn es keine Fehlerbehandlung gibt

public class UnCheckedLengthException extends RuntimeException { 
	public UnCheckedLengthException() { 
		super("Der Text ist zu lang!"); 
	} 
}