Erste Schritte try-catch-Klauseln, überprüfte Ausnahmen

babuschka

Top Contributor
Hi,

ich lerne gerade die Struktur von try-catch-Klauseln und die überprüften Ausnahmen, die im Java-API definiert sind.
Lt. Buch überprüft der Compiler diese und fordert, daß im Code solcherlei Ausnahmen ENTWEDER durch eine try-Klausel abgefangen ODER durch eine throws-Klausel weitergeleitet werden.
In meinem letzten Codebeispiel ist es aber so, daß ich beides habe - wenn ich die try-Klausel - oder auch die catch-Klausel - kommentiere, funktioniert es auch nicht mehr. Also brauche ich wohl beides.
Der Code ist dieser:
Java:
import static java.lang.System.out;

class Sleep2_alternative {
	
	// Dieser Code ist eine Alternative zu >Sleep2<. Hier wird die Ausnahme in anderer Weise verarbeitet.
	public static void main(String[] args) {
		out.println("Sechs Sek Pause...");
		
		// Hier steht der Aufruf der takeANap-Methode innerhalb der try-Klausel.
		try {
			takeANap();
		}
		// Die catch-Klausel ist wie im letzten Codebeispiel;
		catch (InterruptedException e) {
			out.println("Unterbrechung der Pause");
		}
		
		out.println("Weiter geht's.");
		/* Hier wird die main-Methode geschlossen. Daher liegt die Definition der Methode >takeANap<
		 * außerhalb der main-Methode. Die Methode wirft ja die InterruptedException weiter an die main.
		 */
	}
		/* Die Methode >takeANap< wird hier so definiert, daß sie die Verantwortung für die
		 * >InterruptedException< an die aufrufende Methode (hier die main-Methode) weitergibt.
		 */
		static void takeANap() throws InterruptedException {
			Thread.sleep(6000);
		}
	}

Aus meinem Buch geht jetzt leider nicht hervor, wieso ich syntaktisch eine try-catch-Klausel brauche, obwohl die Methode takeANap schon eine throws-Klausel beinhaltet.
Kann mir das jemand hier verständlich machen?
Danke vielmals!
Gruß,

Javaswillerdenn
 
deine Methode wirft die Exception sozusagen hoch zur aufrufenden Methode in dem Fall der Main-Methode, wo du sie dann trotzdem behandeln musst mit Try-Catch
 
In takeNap() hast Du die throws-Klausel definiert. Das hast du gemacht, weil Thread.sleep diese werfen könnte. Deswegen brauchst Du dort kein try-catch. In Deiner main rufst Du eine Methode auf, die eine checked Exception schmeißt. Deswegen brauchst Du dort ein try-catch. Wenn Du es in der main nicht wolltest, müsstest Du main mit einer throws-Klausel versehen.
 
Exceptions müssen behandelt werden. Entweder direkt im catch-Block oder in der aufrufenden Methode bzw. in den aufrunden Methoden. Der Compiler geht immer davon aus, dass der Fall einer Ausnahme eintreten könnte

Nur RuntimeException und ein paar andere müssen nicht behandelt werden
 

Zurück
Oben