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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这个题用以下代码可以得分不:
package demoTest;

//若是打印finally first,则可证明先执行finally
public class proveFinallyFirst {
        public static void main(String[] args){
                try {
                        return;
                       
                }
               
                finally{
                        System.out.println("finally first");
                }
        }

}





评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

6 个回复

倒序浏览
public class Test5 {
/**
  * 需求:用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?
  * 思路:
  * 1.首先定义一个两个整数相除的类,并在类中对可能出现问题的地方进行异常的处理。
  * 2.定义主函数创建该类对象。
  * 3.调用该类中的div方法,传入除数与被除数。
  * 4.对其可能出现问题的地方进行异常处理,并在try中写入return语句。如果运行结果中出现了finally
  * 而没有出现over说明finally中的语句是在return前面执行的,而finally外的语句是在return后面执行的。
  *
  * 结果为:8
  *   finally
  *
  * 总结:当在try写入了return语句的时候运行的结果中有finally而没有over,说明finally中的语句是
  * 在return之前就执行了,而finally外的语句是在return之后执行的。由此可以判定finally中的语句是
  * 永远执行的,一般是放入释放资源的语句,只有当在finally之前出现过System.exit(0);
  * 的时候finally才执行不到。
  */
public static void main(String[] args) {
  //创建一个Demo的对象。
  Demo d=new Demo();
  try{
   //调用div并把它的值赋值给int类型的x。
   int x=d.div(8,1);
   System.out.println(x);
   return ;
  }
  //捕获异常信息。
  catch (Exception e){
   //获取异常信息。
   System.out.println(e.toString());
  }
  //定义一个程序必须会输出的语句
  finally{
   //输入语句用于判断在try中写入return的时候是否会执行到,
   //如果能打印出来说明在return前执行,如果打印不了说明在return后执行。
   System.out.println("finally");
  }
  //输出最后结束的语句用于判断如果在try中写入return的时候是否会执行到。如果执行不到说明是先执行return。
  System.out.println("over");  
}
}
//定义一个Demo类,
class Demo{
//定义一个方法,该方法是用于算出两个整数的商。
int div(int a,int b){
  //判断被除数是否为0;
  if(b==0)
   //如果为零则对其进行try异常处理并抛出 异常信息。
   try {
    throw new Exception("除数为零了");
   } catch (Exception e) {
    //抛出异常信息。
    e.printStackTrace();
   }
  //返回a/b的值。
  return a/b;
}
}

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 cat73 于 2014-7-4 00:43 编辑

调用一下 返回值说明一切
        public static int test(){
               
                try{
                        return 1;
                }
                finally{
                        return 2;
                }
        }
实际上我还是认为,无论怎么在Java代码上写,都无法严谨的证实Jre的执行顺序
最好的证实方式,看Jre的源代码里是怎么执行的,或者反汇编Jre后观察

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
cat73 发表于 2014-7-4 00:41
调用一下 返回值说明一切
        public static int test(){
               

我提交的就是这种方式。。。至于你说的严谨证明,同感!!
回复 使用道具 举报
\(^o^)/ 发表于 2014-7-4 00:28
public class Test5 {
/**
  * 需求:用代码证明,在try中写了return,后面又写了finally,是先执行return ...

嗯,的确可以,只是有点麻烦了。。。我一直认为我上面的代码也可以证明
回复 使用道具 举报
public class Test6//如下情况:在finally中有return的情况下,try中return永远不会返回结果
{
        public static void main(String[] args)
        {
                System.out.println("正常情况如下:");
                System.out.println(transStringToInt("23"));//正常运行下,try中return不执行
               
                System.out.println();//空一行
               
                System.out.println("异常情况下:");               
                System.out.println(transStringToInt("t"));//异常情况下,try中return同样不执行
        }

        private static int transStringToInt(String str)
        {
                try
                {
                        int result= Integer.parseInt(str);
                        System.out.println("执行了  try块内容,result为:"+result);       
                        return result;
                }
                catch(NumberFormatException n)
                {
                        System.out.println("发生异常了!");
                }
                finally
                {
                        System.out.println("执行了finally");
                        return -1;
                }
        }
}
回复 使用道具 举报
我不是来灌水的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马