A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 段海涛 于 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注释去掉,函数的最终返回值又将发生什么变化?



评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
在你写的catch 中语句是发生异常时返回的,finally是不管是否发生异常都回去执行的,catch主要是为了抛出异常,finally主要是为了关闭一些打开的资源,
回复 使用道具 举报
当出现异常,两个return语句,应该编译不能通过吧
回复 使用道具 举报
return 会覆盖的吧
回复 使用道具 举报
不会发生变化~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马