Java - wann muss ich eine Exception Handeln und wann nicht?

4 Antworten

Soweit hast du die beiden 'Wege' schon erkannt:

 entweder die Methode foo() in einem try-catch-Block aufrufen

 dass ich in die Methode bar() auch "throws ...Exception" in die Methodensignatur mit dazu schreiben muss

Beides trifft allerdings nur zu, wenn deine foo() Methode mitteilt, dass eine Exception geworfen wird.

Sprich, beide Beispiele gehen davon aus, dass deine foo-Methode so aussieht:

public void foo() throws Exception {
    ....
}

allerdings bist du nicht dazu 'gezwungen'  das throws Exception zu verwenden.

Mir ist aufgefallen, dass ich in einem Spring-Boot Controller problemlos "throw new DataAccessResourceFailureException("")" schreiben kann, ohne dass ich ein try-catch drum herum baue und ohne ein "throws..." in der Methodensignatur.

Sofern du nicht direkt die Exception-Klasse, sondern eine Ableitung wie UnsupportedOperationException verwendest, wird eine Exception geworfen, jedoch unbehandelt.

public void foo() {
  throw new UnsupportedOperationException("not supported yet.");
}

Wie kann das sein?

Weil du nur dazu 'gezwungen' wirst, ein trycatch oder die weitergabe via throws zu verwenden, wenn du entweder direkt die Exception-Klasse wirfst oder deine Methode ein throws Exception enthält.

Theoretisch kann man das 'verschachtelt' umgehen:

public void foo() throws UnsupportedOperationException{ }

public void bar() {
   try {
     foo();
   } catch (UnsupportedOperationException e){
     throw e;
   }
}

Und wann muss ich die Exceptions Handeln und wann nicht?

Je nach dem wie es 'sinnvoll' ist und wie deine Anwendung aufgebaut ist und es entsprechend für Sinnvoll erachtet wird.

Sagen wir du  hast eine Klasse, die einen Datensatz repräsentiert. Deine Methode: save() kann eine Exception werfen.

Beim Drücken auf Speichern in deiner Anwendung führst du entweder das Speichern aus, oder Informierst den Anwender über den Fehler, warum nicht gespeichert werden konnte.

Für spezifischere 'Varianten' wäre es gut, wenn du ein genaueres Beispiel hättest.

Es gibt in Java verschiedene Arten von exceptions.
Einige von diesen müssen behandelt werden (FileNotFoindException müsste eine sein), einige allerdings nicht (OutOfMemmoryException)

Wenn eine exception nicht gefangen wird hat das zur Folge, dass sich das Programm beendet.
Exceptions die regelmäßig geworfen und auch logisch behandelt werden können, verlangen vom Programmierer meist eine Behandlung (try, throws)

Irgendwann musst du jede geworfene Exception handeln.
Davor kannst du sie allerdings fleißig weiter werfen. In welchem Teil des Programms du diese dann fängst, hängt von der Logik und Struktur ab.

Wenn du z.B. eine Datei einlesen möchtest und dafür eine Oberfläche hast, die den Pfad an die Lese Methode weitergibt. In dieser Methode wird dann die FileNotFoundException geworfen. Hier kannst du entweder die Exception an die aufrufende Methode der Oberfläche werfen und diese hier in eine entsprechende Meldung verarbeiten oder diese in der Lese Methode fangen und eine negative Rückmeldung an die Oberflächen Methode geben.
Beides ist u.U. sinnvoll.

Es gibt zusätzlich z den normalen exceptions noch runtimeexceptions und errors.

Letztere beiden müssen nicht mit throws in der methode angegeben werden weil die warscheinlich fehler signalisieren. Die nicht handelbar sind.

Versuchs mal in dem springbootcontroller mit throw New exception(test) ich vermute mal das er dir das ankreidet.

nachtrag: Jep. Dein beispiel ist eine runtime exception.