10 Behandeln und Weiterreichen einer Ausnahme

Submitted by javafrage on Fri, 01/25/2013 - 09:28

In der folgenden Implementierung wird eine Ausnahme behandelt und dann eine neue erzeugt. Welche Blöcke werden ausgeführt und warum? Wie sieht die Konsolenausgabe aus?

Hinweis: Der Code der im Vergleich zur Frage 9 geändert wurde, ist fett markiert:

package s1.block10;

public class Frage10{
   public static void main(String[] args) {
     int a = 5;
     int b = 0;
     int c = 0;
     System.out.println("main:before");
     c = doubleDiv(a, b);
     System.out.println("main:after");
   }

static int doubleDiv(int a, int b) {
   int d;
   System.out.println("doubleDiv:before");
   try {
     d = 2 * divide(a, b);
   } catch (IllegalArgumentException e) {
       System.out.println("doubleDiv: IllegalArgumentException: "
           + e.getMessage());
       d = -2;
   }
   System.out.println("doubleDiv:after");
   return d;
}

static int divide(int a, int b) {
   int d;
   System.out.println("divide:before");
   try {
      d = a / b;
   } catch (IllegalArgumentException e) {
      System.out.println("divide: IllegalArgumentException");
      d = -1;
   } catch (ArithmeticException e) {
      System.out.println("divide: ArithmeticException");
      throw new IllegalArgumentException("Ich kann nicht mehr");
   } catch (RuntimeException e) {
      System.out.println("divide: RuntimeException");
      d = -3;
   }
   finally {
      System.out.println("divide: geschafft");
   }
   System.out.println("divide:after");
   return d;
   } // Ende main()
} // Ende der Klasse

Die Antwort finden Sie hinter der nächsten Frage (URL rechts unten klicken).

Niveau 2
Schwierigkeitsgrad mittel
Zeit 6 Minuten

Antwort zu Frage 9: Programmablauf bei mehreren catch Blöcken

Der erste Catch Block in divide() wird nicht aufgerufen weil die entsprechende Ausnahme nicht vorliegt.

Der zweite Catch Block wird aufgerufen da die Ausnahme die passende ArithmeticExpetion ist.

Der dritte Catch Block wird nicht mehr aufgerufen obwohl eine ArtithmeticException auch eine RuntimeException ist. Die Ausnahme wurde schon im vorhergehenden Block behandelt.

Der finally Block wird immer durchlaufen.

main:before
doubleDiv:before
divide:before
divide: ArithmeticException
divide: geschafft
divide:after
doubleDiv:after
main:after