黑马程序员技术交流社区

标题: 两段代码的区别 [打印本页]

作者: 马林康    时间: 2012-7-18 15:54
标题: 两段代码的区别
本帖最后由 马林康 于 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. }
复制代码

作者: 乞文超    时间: 2012-7-18 16:24

作者: 孙新强    时间: 2012-7-18 16:29
你是不是疑惑 try中出现return语句  finally会不会执行的问题啊

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

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

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



作者: 位雪    时间: 2012-7-18 16:32
我自己的理解是第一段代码finally中多了return语句,finally中是必须执行的语句,返回num是System.out.println("finally执行了"+ ++num);执行后的num值6,覆盖try中返回值5
第二段代码finally中没有return语句,执行try中的返回num值5。
我自己的理解不知道对不。。。
作者: 袁錦泰    时间: 2012-7-18 16:34
大家一起來找茬....
作者: 程潇    时间: 2012-7-18 16:38
第一段代码:
return num;执行了两遍,两个return之间对num有一个自增的操作,最终取的是第二次返回的num值6
第二段代码:
return num;只执行了try中的return,虽然finnaly块中对num进行了自增,但是返回的依然是自增前的num值5

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


作者: 张水荣    时间: 2012-7-18 16:42
本帖最后由 张水荣 于 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.
作者: 陌花╮有意、    时间: 2012-7-18 17:30
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





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