finally ステートメントが実行されない状況は少なくとも 2 つあります。
(1) try ステートメントが実行されない try ステートメントの前に return が返された場合、finally ステートメントは実行されません。これは、finally ステートメントを実行するための必要条件ではあるが、十分ではない条件が、対応する try ステートメントを実行する必要があることも示しています。
(2) try ブロック|catch ブロック内に System.exit(0); のような文があります。 System.exit(0) は Java 仮想マシン JVM を終了します。もちろん、finally ステートメントは実行されません。
try-catch-finally では、return がfinallyに遭遇した場合、return はfinallyに対して無効です。つまり:
1. try catch ブロックでreturnが行われると、finallyも実行されます。
2.finally の return ステートメントは、try catch ブロックの return ステートメントの効果を上書きします。
結論: return ステートメントは必ずしも関数の終了ではありません。return が実行されると、return 後の値が戻り値変数にコピーされるだけです。
class Exc{ int a; int b; } public class Except { @SuppressWarnings("finally") static int compute (){ Exc e = new Exc(); e.a = 10; e.b = 10; int res = 0 ; try{ res = e.a / e.b; System.out.println("try ……"); return res + 1; }catch(NullPointerException e1){ System.out.println("NullPointerException occured"); }catch(ArithmeticException e1){ System.out.println("ArithmeticException occured"); }catch(Exception e3){ System.out.println("Exception occured"); }finally{ System.out.println("finnaly occured"); } System.out.println(res); return res+3; } public static void main(String[] args){ int b = compute(); System.out.println("mian b= "+b); } }
出力:
try …… finnaly occured mian b= 2
結論: 例外がなければ、try のコードブロックを try のリターンまで実行し、finally が実行された後、try のコードブロックを実行します。戻る。終了機能。
class Exc{ int a; int b; } public class Except { @SuppressWarnings("finally") static int compute (){ Exc e = new Exc(); // e.a = 10; // e.b = 10; int res = 0 ; try{ res = e.a / e.b; System.out.println("try ……"); return res + 1; }catch(NullPointerException e1){ System.out.println("NullPointerException occured"); }catch(ArithmeticException e1){ System.out.println("ArithmeticException occured"); }catch(Exception e3){ System.out.println("Exception occured"); }finally{ System.out.println("finnaly occured"); } System.out.println(res); return res+3; } public static void main(String[] args){ int b = compute(); System.out.println("mian b= "+b); } }
出力:
ArithmeticException occured finnaly occured 0 mian b= 3
結論: try で例外が発生した場合は、catch の実行後、例外ステートメントで catch によってキャプチャされた例外コード ブロックにジャンプし、最後に実行して try{}catch{} から抜け出します。 finally{} は、下方向に実行を継続し、try の後続のステートメントは実行されません。
以上がJavaのfinally文の例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。