Javaの例外取得について

4765 ワード

一、Java異常捕獲に関するメモ:
まずコードを見てください.
 1 import java.io.FileNotFoundException;

 2 public class ExceptionTest 

 3 {

 4     

 5     int f1() throws FileNotFoundException{

 6         System.out.println("f1 Executed!");

 7         throw new FileNotFoundException("aaa");

 8     }    

 9     int f2(){

10         System.out.println("before call f1");

11         try {

12             f1();

13             System.out.println("in try after call f1");

14         } catch (FileNotFoundException e) {

15             System.out.println("Exception");

16             return 3;

17         }

18 /*        finally{

19             System.out.println("finally");

20         }*/

21         System.out.println("after call f1");

22         return 0;

23     }

24     

25     public static void main(String args[]){

26         ExceptionTest test=new ExceptionTest();

27         int x=test.f2();

28         System.out.println("x="+x);

29     }

30 }

 
以上のコードに対して、関数f 2で関数f 1を呼び出すと、f 1()の機能はthrowの1つのExceptionであり、他の機能はありません.
以上のテストにより、以下の結論が得られます.
1.catchブロックにreturn文がある場合、f 1()が例外を投げ出すと、catchブロックのreturn文は実行可能であり、「return 3」が実行されると、関数f 2()はここで終了し、16行目以降の文は実行されなくなる.
2.catchブロックにreturn文がない場合(プログラム16行目の「return 3」を注釈して)、f 1()が投げ出した例外がcatchによってキャプチャされた後、catch{}ブロックの文が実行される.catchブロック内の文が実行されるとtry-catch以外の文(21行目以降の文)が実行され続け、「after call f 1」が印刷され、f 2()が0に戻る.
これにより、例外を投げ出すとtry{}ブロック内の文のみが中断され、try{}ブロック以外の文は影響を受けません.すなわち、例外を投げ出すかどうかにかかわらず、catch{}にreturn文がない限り、try{}ブロック後の文はfinally{}ブロック内にあるかどうかにかかわらず実行されます.
3.ではfinally{}ブロックの存在の違いはありますか?一つだけ、catch{}にreturn文が存在する場合(16行目)、プログラムはfinallyブロックの文(19行目)、catchブロックのreturnを実行します.実行順序は15、19、16行目です.この場合、catchブロックでreturnされているため、コード文(19行目)の外にfinally{}パッケージがなければ、このコード(19行目)は実行されません.
一方、catch{}にreturn文が存在しない場合(16行目に注釈が付けられている)、文の外側にfinally{}の小包があるかどうかは、その効果は同じです(つまり、異常な投げ出しがあるかどうかにかかわらず、実行されます).