finallyブロックでエラーをスローするとどうなりますか?対応するcatch句の1つで処理されますか?
7 に答える
finallyブロックに別のtry-catchブロックを配置した場合のみ。それ以外の場合は、他のエラーと同じです。
最終的に自分自身をブロックするまで、例外を処理しません。
public static void main(String[] args) throws Exception {
try {
System.out.println("In try");
} catch (Exception e) {
System.out.println("In catch");
} finally{
throw new Exception();
}
}
上記のコードは例外をスローしますが、次のように実行すると機能します。
public static void main(String[] args){
try {
System.out.println("In try");
} catch (Exception e) {
System.out.println("In catch");
} finally{
try{
throw new Exception();
}catch(Exception e){}
}
}
finallyまたはcatchブロック内にtry-catchブロックを含める必要があります。
例えば:
try {
// your code here
} finally {
try {
// if the code in finally can throw another exception, you need to catch it inside it
} catch (Exception e) {
// probably not much to do besides telling why it failed
}
} catch (Exception e) {
try {
// your error handling routine here
} catch (Exception e) {
// probably not much to do besides telling why it failed
}
}
いいえ。それはcatchによってキャッチされ、try / catch/finally全体が別のtry/catch内にネストされます。それ以外の場合、例外は関数からスローされ、関数の呼び出し元によって処理されます。
いいえ、そうではありません。これをfinallyブロックで処理するか、メソッドの説明で適切なthrow宣言を定義する必要があります。
いいえ、catchブロックは、対応するtry
ブロック内でスローされた例外のみをキャッチできます。ブロックはキャッチできませんfinally
。(もちろん、そのfinally
ブロックが別のブロック内にある場合でも、そのtry
ブロックのcatch句は引き続き使用されます。) try
JLSの関連セクションは14.20.2です。そこにリストされている各フローには、次のようなものがあります。
何らかの理由でfinallyブロックが突然完了した場合、同じ理由でtryステートメントが突然完了します。
catch
つまり、ブロックに関連付けられている句finally
で例外を処理する試みはありません。
実行の順序は通常、ステートメントの順序によって直接示されます。1. try、2。指定された順序で例外をキャッチします(1つのcatchのみが実行されます)。3。最後に。
したがって、finallyブロックが実行されると(returnステートメントまたは例外がtryまたはcatchブロックでスローされた場合でも、これは常に当てはまることに注意してください)、tryステートメントの実行は最後のフェーズにあるため、キャッチできません。さらにスローアブル。すでに指摘したように、例外はスタックのさらに下の場所で処理する必要があります(または、視点によっては上になります;))。