Java异常处理(try、catch、finally使用)

来源:互联网 发布:淘宝详情图片格式 编辑:程序博客网 时间:2024/06/06 00:29

前言

今天在看《重构:改善既有代码的设计》文章,里面有一句话引发了我对try、catch和finally的思考。重构一书里写到“如果在try区段内可能引发异常的语句之后,以及所有catch区段之内,都重复执行了同一段代码,就可以将这段重复代码移到finally区段”,但是大家是否真正的了解finally的执行顺序,错误的使用finally可能会导致灾难性的后果。看到一篇不错的介绍try、catch、finally执行顺序的文章,转载过来。

原文链接

转载注明出处:http://www.blogjava.net/fancydeepin/archive/2012/07/08/382508.html

异常处理机制

1. 调试追踪代码:
public static void enterTryMethod() {System.out.println("enter after try field");}public static void enterExceptionMethod() {System.out.println("enter catch field");}public static void enterFinallyMethod() {System.out.println("enter finally method");}
2. 抛出Exception,没有finally,当catch遇上return
public static int catchTest() {int res = 0;try {res = 10 / 0; // 抛出Exception,后续处理被拒绝enterTryMethod();return res;// Exception已经抛出,没有获得被执行的机会} catch (Exception e) {enterExceptionMethod();return 1;// Exception抛出,获得了调用方法并返回方法值的机会}}
后台输出结果:
enter catch field1
3. 抛出Exception,当catch体里有return,finally体的代码块将在catch执行return之前被执行
public static int catchTest() {int res = 0;try {res = 10 / 0; // 抛出Exception,后续处理被拒绝enterTryMethod();return res;// Exception已经抛出,没有获得被执行的机会} catch (Exception e) {enterExceptionMethod();return 1;// Exception抛出,获得了调用方法并返回方法值的机会} finally {enterFinallyMethod(); // Exception抛出,finally代码将在catch执行return之前被执行}}
后台输出结果:
enter catch fieldenter finally method1
4. 不抛出Exception,当finally代码块里面遇上return,finally执行完后将结束整个方法
public static int catchTest() {int res = 0;try {res = 10 / 2; // 不抛出ExceptionenterTryMethod();return res;// 获得被执行的机会,但执行需要在finally执行完成之后才能被执行} catch (Exception e) {enterExceptionMethod();return 1;} finally {enterFinallyMethod();return 1000; // finally中含有return语句,这个return将结束这个方法,不会在执行完之后再跳回try或者catch继续执行,方法到此结束}}
后台输出结果:
enter after try fieldenter finally method1000
5. 不抛Exception,当finally代码块里面遇上System.exit()方法将结束和终止整个程序,而不只是方法
public static int catchTest() {int res = 0;try {res = 10 / 2; // 不抛出ExceptionenterTryMethod();return res;// 获得被执行的机会,但由于finally已经终止程序,返回值没有机会被返回} catch (Exception e) {enterExceptionMethod();return 1;} finally {enterFinallyMethod();System.exit(0); // finally中含有System.exit()语句,System.exit()将退出整个程序,程序将被终止}}
后台输出结果:
enter after try fieldenter finally method
6. 抛出Exception,当catch和finally同时遇上return,catch的return返回值将不会被返回,finally的return语句将结束整个方法并返回
public static int catchTest() {int res = 0;try {res = 10 / 0; // 抛出Exception,后续处理将被拒绝enterTryMethod();return res;// Exception已经抛出,没有获得被执行的机会} catch (Exception e) {enterExceptionMethod();return 1; // Exception已经抛出,获得被执行的机会,但返回操作将被finally截断} finally {enterFinallyMethod();return 10;// return将结束整个方法,返回值为10}}
后台输出结果:
enter catch fieldenter finally method10
7. 不抛出Exception,当finally遇上return,try的return返回值将不会被返回,finally的return语句将结束整个方法并返回
public static int catchTest() {int res = 0;try {res = 10 / 2; // 不抛出ExceptionenterTryMethod();return res;// 获得执行机会,但返回将被finally截断} catch (Exception e) {enterExceptionMethod();return 1;} finally {enterFinallyMethod();return 10;// return将结束整个方法,返回值为10}}
后台输出结果:
enter after try fieldenter finally method10

结论

Java的异常处理中,程序执行完try里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有finally的代码块
  • 如果没有finally代码块,整个方法在执行完try代码块后返回相应的值来结束整个方法
  • 如果有finally代码块,此时程序执行到try代码块里的return一句之时并不会立即执行return,而是先去执行finally代码块里的代码
若finally代码块里没有return或没有能够终止程序的代码,程序在执行完finally代码块代码之后再返回try代码块执行return语句来结束整个方法。若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return
在抛出异常的情况下,原理也是和上面的一样的,你把上面说到的 try 换成 catch 去理解就OK了。












0 0
原创粉丝点击