异常 try catch finally return 执行关系 MD

Markdown版本笔记我的GitHub首页我的博客我的微信我的邮箱
MyAndroidBlogsbaiqiantaobaiqiantaobqt20094baiqiantao@sina.com

异常 try catch finally return 执行关系 MD


目录

目录
探讨finally语句的执行与return的关系

探讨finally语句的执行与return的关系

Java异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?不一定,至少有两种情况下finally语句是不会被执行的:

  • try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
  • 在try块中有System.exit(0)这样的语句,System.exit(0)是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

1、finally语句是在try的return语句执行之后,return返回之前执行的
测试案例:

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static String test() {try {System.out.println("try block");if (new Random().nextBoolean()) {return "直接返回";} else {return test2();}} finally {System.out.println("finally block");}}public static String test2() {System.out.println("return statement");return "调用方法返回";}
}

运行结果:

try block
finally block
直接返回

try block
return statement
finally block
调用方法返回

说明try中的return语句先执行了,但并没有立即返回,而是等到finally执行结束后再返回。

这里大家可能会想:如果finally里也有return语句,那么是不是就直接返回了,try中的return就不能返回了?看下面。

2、finally块中的return语句会覆盖try块中的return返回

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static String test() {try {System.out.println("try block");return "在try中返回";} finally {System.out.println("finally block");return "在finally中返回";}// return "finally外面的return就变成不可到达语句,需要注释掉否则编译器报错";}
}

运行结果:

try block
finally block
在finally中返回

这说明finally里的return直接返回了,就不管try中是否还有返回语句。

这里还有个小细节需要注意,finally里加上return过后,finally外面的return b就变成不可到达语句了,也就是永远不能被执行到,所以需要注释掉否则编译器报错。

3、如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变,也可能不变
测试用例:

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static int test() {int b = 20;try {System.out.println("try block");return b += 80;} finally {b += 10;System.out.println("finally block");}}
}

运行结果:

try block
finally block
100

测试用例2:

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static List<Integer> test() {List<Integer> list = new ArrayList<Integer>();list.add(10086);try {System.out.println("try block");return list;} finally {list.add(10088);System.out.println("finally block");}}
}

运行结果:

try block
finally block
[10086, 10088]

这其实就是Java到底是传值还是传址的问题了,简单来说就是:Java中只有传值没有传址。

这里大家可能又要想:是不是每次返回的一定是try中的return语句呢?那么finally外的return不是一点作用没吗?请看下面

4、try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static int test() {int b = 0;try {System.out.println("try block");b = b / 0;return b += 1;} catch (Exception e) {b += 10;System.out.println("catch block");} finally {b += 100;System.out.println("finally block");}return b;}
}

运行结果是:

try block
catch block
finally block
110

这里因 为在return之前发生了异常,所以try中的return不会被执行到,而是接着执行捕获异常的 catch 语句和最终的 finally 语句,此时两者对b的修改都影响了最终的返回值,这时最后的 return b 就起到作用了。

这里大家可能又有疑问:如果catch中有return语句呢?当然只有在异常的情况下才有可能会执行,那么是在 finally 之前就返回吗?看下面。

5、当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全一样

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static int test() {int b = 0;try {System.out.println("try block");b = b / 0;return b += 1;} catch (Exception e) {b += 10;System.out.println("catch block");return 10086;} finally {b += 100;System.out.println("finally block");}//return b;}
}

运行结果:

try block
catch block
finally block
10086

说明了发生异常后,catch中的return语句先执行,确定了返回值后再去执行finally块,执行完了catch再返回,也就是说情况与try中的return语句执行完全一样。

总结:

  • finally块的语句在try或catch中的return语句执行之后返回之前执行
  • 且finally里的修改语句可能影响也可能不影响try或catch中return已经确定的返回值
  • 若finally里也有return语句则覆盖try或catch中的return语句直接返回

2019-3-4

转载于:https://www.cnblogs.com/baiqiantao/p/10472137.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java数据结构之线性表(2)

从这里开始将要进行Java数据结构的相关讲解&#xff0c;Are you ready&#xff1f;Lets go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的几张&#xff0c;我们将会分别讲解这几种数据结构&#xff0c;主要也是通过Java代码的…

凉哥核心圈程序员必备十大图书推荐(一)

写在前面 凉哥核心圈程序员必备十大图书推荐&#xff08;一&#xff09;&#xff0c;各位伙伴应该一目了然了哈&#xff0c;没错凉哥准备出一系列图书推荐的文章&#xff0c;其实很多朋友在私下问凉哥除了大学的课程外自己要不要读一些技术类的书籍呢&#xff0c;答案当时要的…

了解大数据的特点、来源与数据呈现方式

本次作业来源于&#xff1a;https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2639 1.浏览2019春节各种大数据分析报告&#xff0c;例如&#xff1a; 这世间&#xff0c;再无第二个国家有能力承载如此庞大的人流量。http://www.sohu.com/a/290025769_313993春节人口迁…

MYSQL中只知表名查询属于哪个SCHEMA

只知道表名XXX查该表属于哪个schema、以及该表有哪些列等信息SELECT * from information_schema.columns WHERE table_name xxx; 只知道列名XXX查哪个schema有该列、以及有列名为XXX的表有哪些等SELECT * from information_schema.columns WHERE column_name XXX;参考链接&am…

ACCESS SQL语法参考

ACCESS SQL语法参考 一. 基础概念 可以使用的数据类型如下&#xff1a; 1. TEXT&#xff1a;文本型&#xff08;指定长度时&#xff09;&#xff0c;备注型&#xff08;不指定长度时&#xff09;&#xff1b; 2. CHAR&#xff0c;NCHAR&#xff0c;VARCHAR&#xff0…

强大而优雅,API 研发管理 EOLINKER 新版正式发布!

EOLINKER 于2019年3月3日正式发布新版本&#xff01;该版本大幅强化各个产品的功能、着重优化了全站的用户交互体验&#xff0c;并且EOLINKER AMS 产品正式更名为 EOLINKER API Studio ——API 工作室&#xff0c;旨在为您提供API文档管理、自动化测试以及开发协作等全方位服务…

关注视聊效果!中星微摄像头对比测试

不知不觉中&#xff0c;一种小型的数码产品不声不响的潜入了大多数网民的家庭——摄像头&#xff0c;这种令网络世界变得活泼、生动、直观的小东西给我们带来了一阵视频的风&#xff0c;它的背后隐藏着什么&#xff1f;让我们揭开背后的秘密&#xff0c;撩起那视频的面纱。 现今…

MarkDown语法-使用博客园的markDown编辑

一个是一个大标题 两个是一个小标题 是三级标题 最高阶标题加下划线 高阶标题加双下划线 是二阶标题二阶标题区块引用blockquotes 换行也是没有关系的啦啦啦啦啦啦啦啦绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿啦啦啦啦啦啦啦啦绿绿了 区块引用可以嵌套 嵌套 标题区块引用…

版本控制--搭建 GitLab 服务器

GitLab 简介 GitLab 是利用 Ruby On Rails 一个开源的版本管理系统&#xff0c;实现一个自托管的 Git 项目仓库&#xff0c;可通过 Web 界面进行访问公开的或者私人项目。它拥有与 GitHub 类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。可以管理团队对仓库…

MATLAB 与 Excel 接口

MATLAB 与 Excel 接口MATLAB 与 Excel 有两种接口方式&#xff1a;一种是通过 MATLAB 提供的 Excel 生成器&#xff0c;生成220 MATLAB 实用教程DLL 组件和 VBA 代码&#xff0c;实现 Excel 对 MATLAB 的调用&#xff1b;另一种是利用 MATLAB 提供的 Excellink 插件&#xff0c…

计算 1+2!+3!+4!+...20!=?

package algs.factorial;import java.math.BigInteger;/*** Author: areful* Date: 2019/3/6* 计算 sum(n!), n1,2, ... 20*/ public class NFactorial {public static void main(String[] args) {System.out.println(calcFactorial0(3));System.out.println(calcFactorial1(3)…

转大学毕业后拉开差距的原因

原文 有人工作&#xff0c;有人继续上学&#xff0c;大家千万不要错过这篇文章&#xff0c;能看到这篇文章也是一种幸运&#xff0c;真的受益匪浅&#xff0c;对我有很大启迪&#xff0c;这篇文章将会改变我的一生&#xff0c;真的太好了&#xff0c;希望与有缘人分享&…

用户态和内核态的理解和区别

1、linux进程有4GB地址空间&#xff0c;如图所示&#xff1a;3G-4G大部分是共享的&#xff0c;是内核态的地址空间。这里存放整个内核的代码和所有的内核模块以及内核所维护的数据。2、特权级的概念&#xff1a;对于任何操作系统来说&#xff0c;创建一个进程是核心功能。创建进…

面经-多益网络

面试时间&#xff1a;2019.07.22 QQ视频面试 面试岗位&#xff1a;人工智能及大数据/一面 面试时长&#xff1a;35分钟 面试内容&#xff1a; 自我介绍项目-视频召回实际场景题-怎么通过数学公式查找相似的数学公式对加班怎么看对比实习公司的特点主动询问落地方向面试评价&…

区块链基础语言(三)——Go语言开发工具

一、在Windows系统安装Goland 1.1 下载 官网地址&#xff1a;https://www.jetbrains.com/go/download/#sectionwindows 1.2 安装 a. 双击“goland-2018.1.5.exe”&#xff0c;单击“运行”&#xff0c;如图1所示&#xff1b; <图1> b. 如图2所示&#xff0c;单击“next”…

最小的K个数

最小的K个数 题目描述 输入n个整数&#xff0c;找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4,。 未完, 待续, 好像设计堆排序 先排序在遍历, 此处使用插曲排序 class Solution { public:void insertSort(vector<int> &am…

准备重新开始写了

工作很忙,而且前一段时间项目组由于方向和人员调整一直很动荡,所以就没有心情和时间来整理技术.准备重新开张了,好好写,争取每个月出一到两篇说得过去的文章.转载于:https://www.cnblogs.com/sun/archive/2008/06/12/1218220.html

Georgia and Bob POJ - 1704 阶梯Nim

$ \color{#0066ff}{ 题目描述 }$ Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, number the grids from left to right by 1, 2, 3, ..., and place N chessmen on different grids, as shown in the following figure for exampl…

Tomcat总结

Tomcat调优原理&#xff1a; 1、增加最大连接数&#xff08;增大值避免队列请求过多&#xff0c;导致响应缓慢&#xff09; 2、调整工作模式 Bio(BlockingI/O)&#xff1a;默认工作模式&#xff0c;阻塞式I/O操作&#xff0c;没有任何优化技术处理&#xff0c;性能比较低。Nio(…

Android中写文本文件的方法

下面是我在Android开发中&#xff0c;一个写文本文件的方法&#xff0c;代码如下&#xff1a; //将字符串写入到文本文件中 public static void WriteTxtFile(String strcontent,String strFilePath) { //每次写入时&#xff0c;都换行写 String strConten…