黑马程序员技术交流社区

标题: 通过实例加深try-catch-finally与返回值之间关系的理解 [打印本页]

作者: 段海涛    时间: 2012-11-21 22:09
标题: 通过实例加深try-catch-finally与返回值之间关系的理解
本帖最后由 段海涛 于 2012-11-21 22:13 编辑

这样写为什么会编译报错?该怎么修改?
  1. class FinalTest {
  2.       public String divErr(int y) {
  3.            String z = "默认返回值";
  4.            try {
  5.                 int x = 5 / y;
  6.                 return z;
  7.           } catch (Exception e) {
  8.                 z = "catch返回值";
  9.           } finally {
  10.                z = "finally返回值";
  11.          }
  12.      }
  13. }
复制代码
显然,这是因为try语句块中的retrun语句可能执行不到,而catch、finally语句块中有没有return语句,这样可能导致函数没有返回值,因此,必须在catch或者finally中加入return语句,如下修改则可编译通过
  1. class FinalTest {
  2.      public String divErr(int y) {
  3.          String z = "默认返回值";
  4.          try {
  5.              int x = 5 / y;
  6.              return z;
  7.         } catch (Exception e) {
  8.              z = "catch返回值";
  9.             System.out.println("z="+z);
  10.             return z;   
  11.         } finally {
  12.               z = "finally返回值";
  13.               System.out.println("z="+z);
  14.              //return z;  
  15. }

  16. }
  17. }
复制代码
这样一来,如在main方法中调用一下,System.out.println("方法运行完毕的返回值是:"+(new FinalTest()).divErr(0) );
运行结果就是这样:
z=catch返回值
z=finally返回值
方法运行完毕的返回值是:catch返回值

明明在catch中已经把z修改,并且进行了return,为何还会执行finally中的语句呢?
既然执行了finally中的语句,且修改了 z = "finally返回值",为何函数运行完毕后的最终返回值却又还是回到catch中的z的值呢?
如果把finally中的return z注释去掉,函数的最终返回值又将发生什么变化?




作者: 罗忠文    时间: 2012-11-25 11:27
在你写的catch 中语句是发生异常时返回的,finally是不管是否发生异常都回去执行的,catch主要是为了抛出异常,finally主要是为了关闭一些打开的资源,
作者: ljhheima    时间: 2012-11-25 16:55
当出现异常,两个return语句,应该编译不能通过吧
作者: 吴新    时间: 2012-11-25 17:15
return 会覆盖的吧
作者: 小灰灰    时间: 2012-11-25 17:19
不会发生变化~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2