您的位置:首页 > 编程语言 > Java开发

java-finally例子

2016-07-03 11:29 337 查看
Java代码  收藏代码

public class TCF {  

  

    static int f1() {  

        try {  

            return 1;  

        } finally {  

            System.out.print("f1");  

        }  

    }  

  

    static int f2() {  

        try {  

            throw new Exception("try error");  

        } catch (Exception e) {  

            return 2;  

        } finally {  

            System.out.print("f2");  

        }  

    }  

  

    static int f3() {  

        try {  

            throw new RuntimeException("try error");  

        } catch (ArithmeticException e) {  

            return 3;  

        } finally {  

            System.out.print("f3");  

        }  

    }  

  

    static int f4() {  

        try {  

            throw new Exception("try error");  

        } catch (Exception e) {  

            throw new RuntimeException("catch error");  

        } finally {  

            System.out.print("f4");  

        }  

    }  

  

    static int f5() {  

        try {  

            throw new Exception("try error");  

        } catch (Exception e) {  

            throw new RuntimeException("catch error");  

        } finally {  

            System.out.print("f5");  

            return 5;  

        }  

    }  

      

    static int f6() {  

        try {  

            throw new Exception("try error");  

        } catch (Exception e) {  

            throw new RuntimeException("catch error");  

        } finally {  

            System.out.print("f6");  

            throw new RuntimeException("finally error");  

        }  

    }  

  

    public static void main(String[] args) {  

        System.out.println(" : " + f1());  

          

        try {  

            System.out.println(" : " + f2());  

        } catch (Exception e) {  

            System.out.println(" : " + e.getMessage());  

        }  

  

        try {  

            System.out.println(" : " + f3());  

        } catch (Exception e) {  

            System.out.println(" : " + e.getMessage());  

        }  

          

        try {  

            System.out.println(" : " + f4());  

        } catch (Exception e) {  

            System.out.println(" : " + e.getMessage());  

        }  

          

        try {  

            System.out.println(" : " + f5());  

        } catch (Exception e) {  

            System.out.println(" : " + e.getMessage());  

        }  

  

        try {  

            System.out.println(" : " + f6());  

        } catch (Exception e) {  

            System.out.println(" : " + e.getMessage());  

        }  

    }  

}  

 

 

输出如下:

 

解释如下:

声明:我们把每一个可以导致方法退出的点称为结束点。

 

f1方法: try中return 1代表着try方法块的结束点,jvm会在该结束点执行之前,执行finally,finally代码块本身没有结束点,所以执行完finally后会返回try方法块,然后执行讨try中的return 1,所以结果输出如上。

 

f2方法:try中throw代表着try方法块的结束点,但是由于有catch的存在,并且catch可以捕获try中抛出的异常,所以catch在某种意义上延续了try的生命周期,try catch此时组成了一个新的整体,try中的throw不再代表一个结束点,而catch中return 2此时代表try catch整体的结束点,这时没有任何语句可以延续try catch的生命周期,JVM知道try catch产生了一个结束点,将要结束方法的执行,所以JVM在这个结束点执行之前立即执行finally,因为finally没有结束点,所以finally执行完毕返回catch,然后执行该catch中的return
2,所以输出结果如上。

 

f3方法:f3和f2的区别在于f3的catch是捕获ArithmeticException,而我们在try中抛出的是RuntimeException,所以catch没能捕获该异常,也就无法延续try的生命周期,所以try的throw形成一个结束点,JVM获知try将要结束该方法的执行,所以马上调用finally,因为finally内部没有结束点,所以会返回try,然后try抛出自己的异常,输出结果如上。

 

f4方法:f4和f2本质相同,只不过f2中catch是以return 2作为自己的结束点,而f4中catch是以抛出异常作为自己的结束点,输出如上。

 

f5方法:f5和f4大部分相同,catch延续try的生命周期,try catch组成一个整体,而这个整体的结束点由catch抛出异常产生,区别就在于下面的部分,JVM知道try catch整体将要结束该方法的执行,所以马上调用finally,而在f5的finally内部有自己的结束点,即:return 5,这样finally自己就结束了整个方法的执行,而不会返回catch,由catch抛出异常,结束该方法的执行,所以会有如上的输出。

 

f6方法:f6和f5大致相同,只不过在f6的finally中是以抛出异常作为自己的结束点,进而结束方法的执行,输出结果如上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: