大学での Java に関する質問に、次のコード スニペットがありました。
class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}
public class C1 {
public static void main(String[] args) throws Exception {
try {
System.out.print(1);
q();
}
catch (Exception i) {
throw new MyExc2();
}
finally {
System.out.print(2);
throw new MyExc1();
}
}
static void q() throws Exception {
try {
throw new MyExc1();
}
catch (Exception y) {
}
finally {
System.out.print(3);
throw new Exception();
}
}
}
出力を答えるように言われました。 と答えました13Exception in thread main MyExc2
が、正しい答えは です132Exception in thread main MyExc1
。 なぜそうなるのでしょうか? がどこに行くのか理解できませんMyExc2
。
ベストアンサー1
あなたの回答を読んで、あなたがどのようにしてそれを思いついたのかを考えると、あなたは「進行中の例外」が「優先」であると考えていると思います。次の点に留意してください。
新しい例外がスローされると、catchブロックまたはfinallyブロックそのブロックから伝播する例外が発生した場合、新しい例外が外側に伝播するにつれて、現在の例外は中止され (忘れ去られ) ます。新しい例外は、他の例外と同様にスタックの巻き戻しを開始し、現在のブロック (catch または finally ブロック) から中止され、途中で適用可能な catch または finally ブロックの対象となります。
ご了承ください適用可能なcatchまたはfinallyブロック含まれるもの:
catch ブロックで新しい例外がスローされた場合、その新しい例外は、その catch の finally ブロック (存在する場合) の対象となります。
throw
ここで、 を押すたびに現在の例外のトレースを中止し、新しい例外のトレースを開始することを覚えておいて、実行を再トレースします。