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 //普通代码块 ...
随机推荐
- mysq错误(1)空用户创建库
mysql5.6.24免安装版: 1.ERROR 1044 (42000): Access denied for user ''@'localhost' to database 现象:创建库失败. 出 ...
- Win7x64_chromeX86_相关路径
1. C:\Users\33\AppData\Local\Google 里面有2个文件夹:“Chrome”.“CrashReports” 2. C:\Program Files (x86)\Googl ...
- 笔记本_hp
1.技术支持 http://support.hp.com/cn-zh 2.搜到的信息:“http://forum.51nb.com/thread-1080424-1-1.html” Product N ...
- [转载] zookeeper faq
Zookeeper FAQ1. 如何处理CONNECTION_LOSS?在Zookeeper中,服务器和客户端之间维持一个长连接,CONNECTION_LOSS意味着这个连接断开了.客户端API返回C ...
- 理解odbc
1.解决什么样的问题?不同的数据库产品,具有不同的特性,也就是方言.因此应用程序针对不同的数据库产品,编写不同的代码.如果换了一个数据库产品,还需要重新编写数据库交互部分,不具备扩展和移植.odbc对 ...
- caffe的db_lmdb.hpp文件
先总的说一下: 类:LMDBCursor: 它干了点什么?它需要传入参数为:mdb_txn(传入它是因为用完它,把它absort掉), mdb_cursor;它应该是用来读出数据的: 类:LMDBT ...
- 关于php的一些小知识
浏览目录: 一.PHP的背景和优势: 二.PHP原理简介: 三.PHP运行环境配置: 四.编写简单的PHP代码以及测试. 一.PHP的背景和优势 1.1 什么是PHP? PHP是能让你生成动态网页 ...
- Python 学习笔记 - 10.类(Class) 1
定义 Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别. 1. 使用一个名为 __init__ 的方法来完成初始化.2. 使用一个名为 __del__ 的方法来完成类似析 ...
- neon汇编,C嵌入汇编
1. Neon-intrics.pdf中的 void vst2q_u16(__transfersize(16) uint16_t * ptr, uint16x8x2_t val);// VST2.16 ...
- entity refenrece 在views中的运用
在一个content type中有一个field是entity reference, 那么这个字段的设置过程中会指定一个entity type和content type和一个具体内容的选择器, 然后到 ...