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中是以抛出异常作为自己的结束点,进而结束方法的执行,输出结果如上
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中是以抛出异常作为自己的结束点,进而结束方法的执行,输出结果如上
相关文章推荐
- java-finally
- java知识点
- javaee-SpringFramework下载
- java 打印程序运行时间
- Java垃圾回收算法
- 详解spring事务属性
- Java final
- springmvc的Controller并发
- elasticsearch Java
- [leetcode-363]Max Sum of Rectangle No Larger Than K(java)
- Javascirpt闭包问题以及解决方案
- Java中==和equals()的区别
- Java 学习笔记
- java框架之springmvc07(国际化处理)
- Struts2校验方法validate以及validateXxx方法
- DAO设计模式
- Thinking in java-对象导论
- Error creating the view. An error occurred while automatically activating bundle
- Error creating the view. An error occurred while automatically activating bundle
- 二叉树的递归和非递归实现 java