Javaの例外取得について
4765 ワード
一、Java異常捕獲に関するメモ:
まずコードを見てください.
以上のコードに対して、関数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{}の小包があるかどうかは、その効果は同じです(つまり、異常な投げ出しがあるかどうかにかかわらず、実行されます).
まずコードを見てください.
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{}の小包があるかどうかは、その効果は同じです(つまり、異常な投げ出しがあるかどうかにかかわらず、実行されます).