浅谈Java语言中try{}catch{}和finally{}的执行顺序问题
浅谈Java语言中try{}catch{}和finally{}的执行顺序问题
2019-04-06 PM 13:41:46
1、 不管有没有出现异常,finally块中代码都会执行;
2、 当try和catch中有return时,finally仍然会执行;
3、 finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、 finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。其主要有以下几种情况:
Case 1:
package com.MrZ_baby.project;
public class Test {
public int add(int x,int y) {
try {
}catch(Exception e) {
}finally {
}
return 0;
}
public static void main(String argv[]) {
Test test = new Test();
System.out.println("x+y="+test.add(43,4));
}
}
输出结果:
x+y=0
显然程序是按顺序执行。先执行try次之执行catch最后执行finall,然后返回add函数里的return 0.
Case 2:
package com.MrZ_baby.project;
public class Test {
public int add(int x,int y) {
try {
return x+y;
}catch(Exception e) {
}finally {
}
return 0;
}
public static void main(String argv[]) {
Test test = new Test();
System.out.println("x+y="+test.add(43,4));
}
}
输出结果:
x+y=47
程序执行try块中return之前(包括return语句中的表达式运算)代码;再执finally块,最后执行try中return;finally块之后的语句return,因为程序在try中已return所以不再执行。
Case 3 :
package com.MrZ_baby.project;
public class Test {
public int add(int x,int y) {
try {
}catch(Exception e) {
return x+y;
}finally {
}
return 0;
}
public static void main(String argv[]) {
Test test = new Test();
System.out.println("x+y="+test.add(43,4));
}
}
输出结果:
x+y=0
程序先执行try,如果遇到异常执行catch块,有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。无异常:执行完try再finally再return.
Case 4 :
package com.MrZ_baby.project;
public class Test {
public int add(int x,int y) {
try {
return x+y;
}catch(Exception e) {
}finally {
return x+y;
}
}
public static void main(String argv[]) {
Test test = new Test();
System.out.println("x+y="+test.add(43,4));
}
}
输出结果:
x+y=47
程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
Case 5 :
package com.MrZ_baby.project;
public class Test {
public int add(int x,int y) {
try {
}catch(Exception e) {
return x+y;
}finally {
return x+y;
}
}
public static void main(String argv[]) {
Test test = new Test();
System.out.println("x+y="+test.add(43,4));
}
}
输出结果:
x+y=47
程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
Case 6 :
package com.MrZ_baby.project;
public class Test {
public int add(int x,int y) {
try {
return x+y;
}catch(Exception e) {
return x+y;
}finally {
return x+y;
}
}
public static void main(String argv[]) {
Test test = new Test();
System.out.println("x+y="+test.add(43,4));
}
}
输出结果:
x+y=47
程序执行try块中return之前(包括return语句中的表达式运算)代码;有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出。无异常:则再执行finally块,因为finally块中有return所以提前退出。
最终结论:
任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器会把finally中的return实现为一个warning。
浅谈Java语言中try{}catch{}和finally{}的执行顺序问题的更多相关文章
- 浅谈Java语言中ArrayList和HashSet的区别
Java语言中ArrayList和HashSet的区别 2019-04-10 13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...
- 浅谈个人对客户端JavaScript同步、异步、执行顺序等概念的理解
一.同步和异步的概念. 同步:即按代码的顺序执行任务. 在下列代码中,按照同步概念,则是先打印1后打印2. console.log(1); console.log(2); 异步:即执行一个任务的同时执 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 【Java心得总结二】浅谈Java中的异常
作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...
- 浅谈Java中的引用
在Java语言中,引用是指,某一个数据,代表的是另外一块内存的的起始地址,那么我们就称这个数据为引用. 在JVM中,GC回收的大致准则,是认定如果不能从根节点,根据引用的不断传递,最终指向到一块内存区 ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
- 浅谈Java线程安全
浅谈Java线程安全 - - 2019-04-25 17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...
- 浅谈JAVA中如何利用socket进行网络编程(二)
转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...
随机推荐
- Tomcat系列(5)——Tomcat配置详细部分
Tomcat的架构图 Tomcat的组织结构 Tomcat是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的是Catalina servlet容器,其他组件按照一定的格式要求配置在这个顶层 ...
- 细说Cookie--转
Cookie虽然是个很简单的东西,但它又是WEB开发中一个很重要的客户端数据来源,而且它可以实现扩展性很好的会话状态, 所以我认为每个WEB开发人员都有必要对它有个清晰的认识.本文将对Cookie这个 ...
- 2018-2019-2 《Java程序设计》第9周学习总结
20175319 2018-2019-2 <Java程序设计>第9周学习总结 教材学习内容总结 本周学习任务: 下载安装MySQL数据库管理系统. 教材介绍在官网下载安装Mysql服务,启 ...
- html的分类与特点
##块级元素##|元素|描述||--|--||h1-h6|标题||div|区分大模块||p|段落||ul>li|无序列表||ol>li|有序列表||dl>dt dd|自定义列表||t ...
- 【bzoj 4449】[Neerc2015]Distance on Triangulation
Description 给定一个凸n边形,以及它的三角剖分.再给定q个询问,每个询问是一对凸多边行上的顶点(a,b),问点a最少经过多少条边(可以是多边形上的边,也可以是剖分上的边)可以到达点b. I ...
- win10中使用 Windows照片查看器
新建一个txt,将文件后缀名改为 .reg 用记事本或者其他txt编辑器编辑,复制下面文字: Windows Registry Editor Version 5.00 ; Change Extensi ...
- js 正则表达式,分组,非捕获或 环视的使用
定位一个字符串中,匹配与定位重复字符中的最后一个字符: 例子: <script type="text/javascript"> var str="http:/ ...
- HttpClient的巨坑
之前做项目的时候,调用api都是使用的HttpWebRequest 最近一个项目改用HttpClient,用了之后,感觉很坑. 1.高并发情况下,造成tcp连接占用的端口无法释放(时间为2MSL,此时 ...
- Ubuntu下 MySql忘记密码解决方案
1.在终端输入 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 2.在文件内搜索skip-external-locking,在下面添加一行: skip-gran ...
- 20175306 MyCP博客总结
课后必做题:MyCP总结 cp命令了解: · 作用:cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若同 ...