まず、doSomething1()とexceltion_handle1()を想定し、System.exit(x)などを呼び出さないようにします。
1)したがって、最初のコードはdoSomething1()であり、doSomething1()が例外をスローするかどうかに関係なく、それを処理し(catchコードブロックを処理)、2番目の試行に進んで同じ方法で実行します。
try {
doSomething1();
} catch(Exception e1){
exception_handle1();
}
try {
doSomething2();
} catch(Exception e2){
exception_handle2();
}
朝なので、間違った決断をしないことを願っています。
2)このコードはdoSomething1()、次にdoSomething2()を実行し、どちらが失敗しても(Exceptionをスロー)、最初のcatch句のみが呼び出されます。これは、すべてのサブクラスとそれ自体を吸収するため、2番目のcatchは呼び出されません。到達しました(最初にすべての可能な例外を取ります)。したがって、afaik、エラーが発生するはずです(コンパイルしないでください)。それは賢く、2番目のキャッチには決して到達しないことを認識します。
正しいパターンは次のようになります。一番下に行くと、例外はますます広くなるはずです(厳密に)。論理的です。キャッチ句の順序が下がるにつれて、上位のキャッチを下位のキャッチの親にすることはできません。いずれにせよ、親はその例外を受け取り、下位の子には到達しません。
Example: (I recommend you to learn about Multicatch in java.)
catch (Specific2ChildOfSpecific1 e3)
...
catch (specific1ChildOfException e2)
...
catch (Exception e1)
try {
doSomething1();
doSomething2();
} catch(Exception e1) {
exception_handle1();
} catch(Exception e2) {
exception_handle2();
}
3)これ:doSomething1()が失敗した場合はe1 catch句が実行され、合格した場合はdoSomething2()が実行され、失敗した場合はe2catch句が実行されます。
@ 2番目の例に注意してください。どのdoSomethingが失敗しても、e1が実行されます(2番目は到達できないため、エラーがあることを忘れないでください)。しかし、私はあなたが何を聞きたかったのか理解しています。
try {
doSomething1();
try {
doSomething2();
} catch(Exception e2){
exception_handle2();
}
} catch(Exception e1){
exception_handle1();
}