黑马程序员技术交流社区

标题: java入学测试第八题 [打印本页]

作者: 你媚你魅你    时间: 2014-7-28 16:57
标题: java入学测试第八题
用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?
作者: yqj    时间: 2014-7-28 23:02
本帖最后由 yqj 于 2014-7-28 23:04 编辑
  1. public class Test2 {
  2.         public static void main(String[] args) {
  3.                 System.out.println("main start");
  4.                 try {
  5.                         System.out.println("try");
  6.                         return;
  7.                 } catch (Exception e) {
  8.                
  9.                 }finally{
  10.                         System.out.println("finally");
  11.                 }
  12.                 System.out.println("main end");
  13.         }
  14. }
复制代码

作者: yqj    时间: 2014-7-28 23:07
yqj 发表于 2014-7-28 23:02

运行结果是:
main start
try
finally
应该是先运行finally,再运行return。不知道是不是对的

作者: 刘高峰    时间: 2014-7-29 02:35
我也考这题了
作者: yqj    时间: 2014-8-2 18:01
应该是先运行try中return,再运行finally中的代码,又研究了下才发现以前的观点是错的
可以用以下代码证明:
思路:try中的return调用test2();方法是为了打印return运行记录,该方法在执行return时运行。

  1. package cn.test;

  2. public class Test2 {
  3.         public static void main(String[] args) {
  4.                 String str =test1();
  5.                 System.out.println("str:"+str);
  6.         }

  7.         private static String test1() {
  8.                 try {
  9.                         System.out.println("try");
  10.                         return test2(); //运行test2代码块
  11.                 } catch (Exception e) {

  12.                 }finally{
  13.                         System.out.println("finally");
  14.                         return "two";
  15.                 }
  16.         }

  17.         private static String test2() {
  18.                 System.out.println("return run!");
  19.                 return "one";
  20.         }
  21. }
复制代码

运行结果是:
try
return run!
finally
str:two
其中打印的return run!是在try中return执行时输出,再finally之前,说明try中return先运行;其次str的值为two而不为one(打印出了return run!说明try中的return被执行过的)说明one被覆盖了,也证明finally中的代码后执行
作者: 小乖乖灬浩歌    时间: 2014-8-2 18:17
楼上说的是
作者: bbdeyouxang    时间: 2014-8-3 01:06
本地运行结果
1406998982171 this is finally time
1406998982165 this is return time
return 的时间是要早一些的

  1. public class TryTest
  2. {

  3.     public static void main(String[] args) {
  4.         
  5.         System.err.println(test()+" this is return time");
  6.     }
  7.    
  8.     private static long test(){
  9.         try{
  10.             return System.currentTimeMillis();
  11.         }catch(Exception e){
  12.             
  13.         }finally{
  14.             for(int i = 0; i < 1000000000; i++){
  15.             }
  16.             System.err.println(System.currentTimeMillis()+" this is finally time");
  17.         }
  18.         return 0;
  19.     }
  20. }
复制代码

作者: ssy1939    时间: 2014-8-4 13:00
楼上这个方法好,直接调用系统时间看结果,顶一个
作者: 冒牌高手    时间: 2014-8-4 15:55
本帖最后由 冒牌高手 于 2014-8-4 16:04 编辑

finally是必须执行的。

作者: 萍水相逢    时间: 2014-8-5 08:49
bbdeyouxang 发表于 2014-8-3 01:06
本地运行结果
1406998982171 this is finally time
1406998982165 this is return time

挺高明的!好!
作者: 王石    时间: 2014-8-5 21:06
先执行return 在执行finally




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