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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马林康 中级黑马   /  2012-7-18 15:54  /  1984 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马林康 于 2012-7-18 16:46 编辑
  1. class Test {

  2.         public static void main(String[] args){

  3.                 System.out.println(method(5));        
  4.         }

  5.         public static int method(int num){

  6.                 try{

  7.                         return num;

  8.                 }finally{

  9.                         System.out.println("fially执行了"+ ++num);
  10.                                                 return num;
  11.                 }

  12.         }

  13. }
复制代码
  1. class Test {

  2.         public static void main(String[] args){

  3.                 System.out.println(method(5));        
  4.         }

  5.         public static int method(int num){

  6.                 try{

  7.                         return num;

  8.                 }finally{

  9.                         System.out.println("fially执行了"+ ++num);
  10.                 }

  11.         }

  12. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
回复 使用道具 举报
你是不是疑惑 try中出现return语句  finally会不会执行的问题啊

无论程序中出现什么问题 finally语句块 都是会被执行到的

就上述两段程序代码分析:
两段代码中 try语句块中都出现了 return语句
但是程序执行时 执行到return语句时  return内容会首先被记录起来 并且会继续往下执行finally
语句块 执行过后 return内容再返回过去

至于两个程序的区别 就是 第二个程序中  finally语句块中出现了 return语句 他将try语句块中的return覆盖了


评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我自己的理解是第一段代码finally中多了return语句,finally中是必须执行的语句,返回num是System.out.println("finally执行了"+ ++num);执行后的num值6,覆盖try中返回值5
第二段代码finally中没有return语句,执行try中的返回num值5。
我自己的理解不知道对不。。。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
大家一起來找茬....
回复 使用道具 举报
第一段代码:
return num;执行了两遍,两个return之间对num有一个自增的操作,最终取的是第二次返回的num值6
第二段代码:
return num;只执行了try中的return,虽然finnaly块中对num进行了自增,但是返回的依然是自增前的num值5

通过运行代码和分析,可以看出尽管try中已经return了num值,但是这个值仍然能够改变,若想返回改变后的值,只需在finnaly中再return一次即可。

回复 使用道具 举报
本帖最后由 张水荣 于 2012-7-18 16:48 编辑

这是程序运行的顺序问题,try{}finally{}语句首先执行的是try{}里面的语句,之后执行finally{}中的语句,并且不管try{}中的语句有没有全部执行,最后一定会执行fianlly中的语句。前一段代码在执行了try{}里面的语句后,接下来执行的是finally{}里面的语句,而没有直接跳出方法执行System.out.println()方法,所以第一次执行的是finally {}里面的System.out.println()方法,执行完后,num的值已经变成6,并且此时又将6返回了,所以前者代码返回的是6,后者代码因为在num的值没有改变之前已经返回,所以当num的值变为6时,返回的仍然是5.
回复 使用道具 举报
finally中是一定会被执行的代码,就算有try中有return,在return之前也会执行finally

第一个程序,结果:
fially执行了6
6
  在执行try中的return之前先执行finaly,由于finally中有return,所以finally抓住了机会 将结果num+1后直接返回,然后再主函数中也打印6

第二个程序,结果:
fially执行了6
5
  在try中return之前依旧执行了finally,由于此时finally中没有return 所以try中的return记录的仍然是num没有自增之前的结果5
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马