谈黑马基础题之--java证明return是在finally执行后才返回的,且在finally无法改变返回值
来源:互联网 发布:sql 2012 创建触发器 编辑:程序博客网 时间:2024/05/21 10:32
进入报名系统后,下载基础题,看了下,做到这个题目的时候产生点疑问。于是研究了下
/**
* 第6题:写一个类证明return是在finally执行后才返回的,且在finally无法改变返回值。
* @author somebodydie
*
*/
一开始的时候,我也是这样写的。。以下代码截取自网络,
/*证明return是在finally执行后才返回的,且在finally无法改变返回值。*/class FinallyTest{public static int demo(){int a = 1;try {System.out.println("try的 a:"+a);return a;//需要被检测的代码块}finally //一定会执行的语句{a=5;System.out.println("finally的 a:"+a);//return 15;}}public static void main(String[] args) {System.out.println("demo:"+demo());//调用demo,如果打印结果为1证明 finally不能改变try里面的返回值}}
以上代码方法跟网上大部分证明方法类似,
证明原理是: 打印结果 返回值为 1 ,所以finally不能改变try里面的返回值。 且先打印try中的内容,在打印 finally中的内容,最后打印 demo:1 所以执行顺序 是 return 在finally之后
可是我仔细想想觉得,这样只证明了 finally不能改变返回值却无法证明,finally在return 之前执行
理由: finally 和 try中的打印 是在方法内部的,正常情况也应该 在 打印 demo:1之前打印,因为本身打印语句执行的顺序都不一样。
我的代码:
public class Test6 {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(prove());}public static int prove(){int i = 0;try{i++;return i/0;}catch (Exception e){e.printStackTrace();}finally{i=100;try {Thread.sleep(1000);//让线程sleep 1秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("此处内容先输出");}return i/0;}}
在finally中我让当前线程sleep一秒,这么做是想证明一点,如果finally执行一定是在return 之前的话,那么两个return 的异常一定会等打印"此处内容先输出"
这句话之后再报出来。但事实上运行结果是:
java.lang.ArithmeticException: / by zero
at com.itheima.Test6.prove(Test6.java:18)
at com.itheima.Test6.main(Test6.java:11)
此处内容先输出
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.itheima.Test6.prove(Test6.java:30)
at com.itheima.Test6.main(Test6.java:11)
分别注释try和最后的那个return 可得出结论:
try中return 应该是在 finally 之前执行的。
经过多次运行发现,
大多数情况 “此处内容先输出” 这句话是在 最后那个异常报出之前输出的。
但有时也会出现这种情况:
java.lang.ArithmeticException: / by zero
at com.itheima.Test6.prove(Test6.java:18)
at com.itheima.Test6.main(Test6.java:11)
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.itheima.Test6.prove(Test6.java:30)
at com.itheima.Test6.main(Test6.java:11)
此处内容先输出
这样的话,到底是最后那个return先执行,还是finally先执行?
基础题中的return 指的又是哪个return?
就有了这些疑问,表示自己才疏学浅,可能文章中有些地方有很低级的错误,希望大家指出。
也希望有大神能给出真正能证明 最后那个return 和 finally 哪个先执行的方法。
- 谈黑马基础题之--java证明return是在finally执行后才返回的,且在finally无法改变返回值
- finally语句是在try的return语句执行之后,return返回之前执行
- 包含在try中的return返回后,仍然会执行finally中的代码
- java基础-用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?
- return与finally的执行顺序与返回值问题
- try--catch--finally中return返回值执行的顺序
- Java在try中return后finally还执不执行?
- java中,return是在finally之前还是之后执行。
- Java finally语句是在return之前还是之后执行?
- JAVA基础(30) Java代码finally语句到底是在return之前还是之后执行?
- return 是在finally的之前还是之后执行!!!
- 关于finally是在return前还是后执行的一个测试
- try{return}finally{}模块中finally中的code是在return前执行还是rerun后执行
- try{return}finally{}模块中finally中的code是在return前执行还是rerun后执行
- try中有return,finally中的code会不会执行,执行是在return前还是后?
- finally里面的return返回值问题
- 关于java中finally中的语句在return前还是后执行的个人理解。
- Java基础之在return中使用finally
- ACE自适配通信环境中文技术文档(中篇:ACE程序员教程)Reactor实例
- [STL基础]Iterator迭代器
- poj 3176 -- Cow Bowling (dp)
- 几种任务调度的 Java 实现方法与比较
- 移动游戏 请别迷信“一夜之间”
- 谈黑马基础题之--java证明return是在finally执行后才返回的,且在finally无法改变返回值
- JAVA数组介绍
- OpenFlashChart简明手册
- CAP原理和BASE思想 ACID模型
- linux下终端使用代理
- apache tomcat 集群 + session 复制
- xclip
- Openfire更服务器名称的方法
- oracle中char() varchar() varchar2()类型之间的联系与区别