浅谈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{}的执行顺序问题的更多相关文章

  1. 浅谈Java语言中ArrayList和HashSet的区别

    Java语言中ArrayList和HashSet的区别 2019-04-10   13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...

  2. 浅谈个人对客户端JavaScript同步、异步、执行顺序等概念的理解

    一.同步和异步的概念. 同步:即按代码的顺序执行任务. 在下列代码中,按照同步概念,则是先打印1后打印2. console.log(1); console.log(2); 异步:即执行一个任务的同时执 ...

  3. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  4. 【Java心得总结二】浅谈Java中的异常

    作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...

  5. 浅谈Java中的引用

    在Java语言中,引用是指,某一个数据,代表的是另外一块内存的的起始地址,那么我们就称这个数据为引用. 在JVM中,GC回收的大致准则,是认定如果不能从根节点,根据引用的不断传递,最终指向到一块内存区 ...

  6. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

  7. 浅谈Java中的深拷贝和浅拷贝

    转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...

  8. 浅谈Java线程安全

    浅谈Java线程安全 - - 2019-04-25    17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...

  9. 浅谈JAVA中如何利用socket进行网络编程(二)

    转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...

随机推荐

  1. rocketmq 集群环境搭建配置

    rocketmq环境搭建配置: 一.   搭建三主集群,环境:centos-64 7.4 + RocketMQ-4.3.2 Master01: 192.168.102.68 Master02: 192 ...

  2. 路径分隔符不一致,导致windows下不能开发

    最近想要基于YAPI扩展开发一个自己的API管理平台,但是发现在windows下直接跑会报错,在Mac跑就没事 报的错是: Uncaught TypeError: $export is not a f ...

  3. vs 开发 win32 程序,调出控制台窗口,方便调试

    设置方法 项目 -> 属性 -> 生成事件 ->后期生成事件 -> 命令行 中添加 editbin /SUBSYSTEM:CONSOLE $(OutDir)\$(Project ...

  4. ArcGis Python脚本——遍历输出面或折线要素的折点坐标

    有示例要素类如下 经过下面代码处理 #遍历输出面或折线要素的折点坐标 #infc:输入要素类 # code source: https://www.cnblogs.com/yzhyingcool/# ...

  5. [Android] Android 手机下 仿 今日头条 新闻客户端

    利用一个月的时间,自学了 Android 开发 ,为了检验学习成果,特意 开发了这个  仿 今日头条 新闻客户端 AppNews 包括图文新闻+视频新闻+图片新闻 预览演示如下: 功能说明: 1)底部 ...

  6. -source 1.5 中不支持泛型(请使用-source5或更高版本)

    Idea中maven--compile时报错     -source 1.5 中不支持泛型(请使用-source5或更高版本) 解决办法 在项目的pom.xml中,添加 <build> & ...

  7. jmeter使用csv传参进行并发测试验证

    1.获取到注册接口,添加HTTP信息头管理器.HTTP请求,设置好入参,且检查使用csv文件传参的入参 2.创建csv文件,写入需要传的入参 3.添加CSV Data Set Config 设置配置 ...

  8. 使用Perfect Player观看电视直播

    Perfect Player下载地址: 官网 http://niklabs.com/ 去广告版本:链接: https://pan.baidu.com/s/1gevIdBghB6lB46vVyfQUWg ...

  9. Django first lesson 环境搭建

    pycharm ide集成开发环境 (提高开发效率) 解释器/编译器 编辑器 调试环境 虚拟机连接 设置VirtualBox端口 操作1 操作2 点击+号添加,名称为SSH,其中主机端口为物理机的端口 ...

  10. 常用数据库:MongoDB

    下载地址:https://www.mongodb.com/download-center/community 安装及配置指南:https://docs.mongodb.com/manual/insta ...