java之trycatchfinally代码块与return,throw的执行顺序的探索
时光荏苒,转眼间毕业都半年了,java编程也五个月了。写代码的过程中,会经常遇到解决代码抛异常的情况。平时只注重完成功能,也没太注意try_catch_finally的内在执行顺序,只知道表面的现象:try里的代码运行出错,catch抓着异常处理,finally最后总要执行。知道一次遇到个少见的问题,当着项目经理的面,把我给难住了,才发现自己会最表面的东西,稍一深入,就跪了。于是痛定思痛,决定做个彻底的爱学的青年。
闲话到此。下面切入正题。
1.普通情况(当然,也是最常见的情况)
我们定义了一个方法,里面有try_catch_finally代码块。
public void methodA() throws Exception{
try{
int i=9,j=0;
int num= i/j;
System.out.println("---- run------");
}catch(Exception e){
System.out.println("----catch run------");
}finally{
System.out.println("----finally run------");
}
}
我们会看到,程序运行结果: ----catch run------ ----finally run------
这是最常见的,最普通的情况。
2.特殊情况A
public static int method2_A() throws Exception{
try{
return -1;
System.out.println("---- run------");
}catch(Exception e){
System.out.println("----catch run------");
}finally{
System.out.println("----finally run------");
}
}
public static void main(String[] args) throws Exception{
System.out.println(method2_A());
}
运行结果:----finally run--- -1
相信很多朋友到这就会有疑问了:咦,怎么是这种顺序呢?return后不久直接跳出函数了吗?finally怎么也这行了?是的,就是这种顺序。jdk底层是怎么执行字节码文件的,咱不去讨论。我在网上找了很多资料,最有权威的说法:jdk执行到try里的return语句时,会暂时把需要return的值放到一个临时的内存区域,然后执行finally里的代码,finally执行完后,jdk在回到临时存储区域把值return。
3.特殊情况B
public static int method3_B() throws Exception{
try{
return -1;
System.out.println("---- run------");
}catch(Exception e){
System.out.println("----catch run------");
}finally{
System.out.println("----finally run------");
return -2;
}
}
public static void main(String[] args) throws Exception{
System.out.println(method3_B());
}
运行结果:----finally run--- -2。这次不但try里有return,finally里也有return了,情况和2又不一样了。jdk走到try的return后,把值临时放到临时存储区,然后执行finally代码,(注意)当读到finally里的return后,直接就把这个值return了,不在回到try里存储的临时区域。
4.特殊情况C(catch里有return,finally里没有return)
public static int method4_C() throws Exception{
try{
int i=9,j=0;
int num= i/j;
return -1;
System.out.println("---- run------");
}catch(Exception e){
System.out.println("----catch run------");
return -2;
}finally{
System.out.println("----finally run------");
}
}
public static void main(String[] args) throws Exception{
System.out.println(method4_C());
}
运行结果:---catch run--- ----finally run--- -2。原理和上面类似,jdk执行字节码,遇到代码有异常,到catch里,有return语句,先不return,执行finally。然后回到catch里return语句临时存储区域,把值return。
5.特殊情况D(catch里有return,finally里有return)
public static int method5_D() throws Exception{
try{
int i=9,j=0;
int num= i/j;
return -1;
System.out.println("---- run------");
}catch(Exception e){
System.out.println("----catch run------");
return -2;
}finally{
System.out.println("----finally run------");
return -3;
}
}
public static void main(String[] args) throws Exception{
System.out.println(method5_D());
}
运行结果:---catch run--- ----finally run--- -3。原理和上面类似,jdk执行字节码,遇到代码有异常,到catch里,有return语句,先不return,把值存储到临时存储区。执行finally,有return,直接return值,不在回到catch的临时存储区。
暂时就总结到这,以后有需要在完善。
java之trycatchfinally代码块与return,throw的执行顺序的探索的更多相关文章
- 顽强的的砂锅之——深究finally代码块与return语句的执行顺序!
当问到finally代码块的执行顺序,就算刚刚学编程的小白都能毫不犹豫的说出答案:不管异常发生与否,finally语句块的代码一定会被执行!大体上这样讲是没有错,但是finally块中的代码一定会有效 ...
- try、finally代码块有无return时的执行顺序
结论: 1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并 ...
- 构造代码块、构造函数、this执行顺序
一.构造函数 对象一建立就会调用与之对应的构造函数. 构造函数的作用:可以用于给对象进行初始化. 构造函数的小细节:当一个类中没有定义构造函数时,系统会默认给该类加一个空参数的构造函数:当在类中自定义 ...
- 由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序
一.阿里巴巴笔试题: public class Test { public static int k = 0; public static Test t1 = new Test("t1&qu ...
- java中静态代码块,构造代码块,以及构造方法的执行顺序
写了许久的代码,却把一些基础的东西都给忘了,今天无聊就顺手写了个,然后测试下,发现跟我记忆中的竟然有些出入,作为一个两年的开发,我感觉自己很失败啊. 父类pojo: public class Pojo ...
- java 代码块,静态代码块,构造器等的执行顺序
写了一段测试代码,如下: public class ExecutionSequence extends fatherClass{ static{ System.out.printl ...
- java普通代码块、静态代码块、默认构造方法的执行顺序
package test; class Parent{ { System.out.println("父类普通代码块"); } static{ System.out.println( ...
- Java中普通代码块,构造代码块,静态代码块区别及代码示例
//执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 1 //普通代码块 ...
- Java中普通代码块,构造代码块,静态代码块执行顺序
//执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 1 //普通代码块 ...
随机推荐
- Nginx基础知识之——配置文件信息(检查配置文件是否正确)
一.检查配置文件是否正确: /usr/local/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf 检查结果: nginx: [emerg] ngin ...
- 11 半联结 & 反联结
半联结 和 反联结是 oracle 优化器能够选择用来在获取信息时应用的两个密切相关的联结方法(实际上是联结方法的选项) 半联结 IN 的半联结 select /* using in */ depar ...
- jquery ajax 实例
$(function(){ $.ajax( { url:'{:U('shenhe')}',// 跳转到 action data:{ }, type:'post', cache:false, dataT ...
- iphone 使用技巧
http://www.app111.com/doc/100147120_1.html(隐藏某个图标) (3)传视频 moliplayer 和itunes ---应用(在下部)找到moliplaye ...
- Jqplot使用总结之二(双Y轴)
最近需要用Jqplot做双Y轴的Chart图,首先我找到了文档上的例子并对数据做了一些调整: 1.例子展示: var s1 = [["2002-01-01", 112000], [ ...
- javascript隐式转换详解
Javascript是web前端开发的必学技术,今天和大家分享的就是javascript的基础知识隐式转换,希望可以帮助大家更好的学习. 转换成布尔类型假 undefined->falSe nu ...
- css3 translate属性
translate(x,y)水平方向和垂直方向同时移动(也就是X轴和Y轴同时移动):translateX(x)仅水平方向移动(X轴移动):translateY(Y)仅垂直方向移动(Y轴移动)默认都是从 ...
- C++ 与设计模式学习(其一)
记得曾经一年前,听到同学再说设计模式,当时觉得不怎么重要,所以就没有去系统的学习,这一放,就是一年,直到前段时间,面试了一个阿里巴巴的职位,要我谈谈对于设计模式的看法. 之后就好好了看了一些文章,好好 ...
- 233. Number of Digit One *HARD* -- 从1到n的整数中数字1出现的次数
Given an integer n, count the total number of digit 1 appearing in all non-negative integers less th ...
- jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示
1.jquery ajax请求方式与提示用户正在处理请稍等 为了提高用户体验度,我们通常会给出 “正在处理,请稍等!”诸如此类的提示.我们可通过设置$.ajax()下的参数beforeSend()来实 ...