我们知道return会结束此方法并返回指定值。以及在Try-catch-finally中无论try代码块中有没有异常finally中的代码时都会被执行的。但是如果return包含在try-catch-finally中的try或catch块中会怎样呢?

我们再做个试验:

  1        static int txt(){
2 try {
3 @SuppressWarnings("unused")
4 int a=5/0;
5
7 } catch (Exception e) {
8 System.out.println("catch");
9 return 2;
10 }finally{
11 System.out.println("finally");
12 }
13 return 3;
14 }

demo

看上面代码我们知道在try中”int a=5/0”是肯定会报错的接下来程序会进入catch中进行异常处理但是在catch中使用return 返回了一个2;这时finally中的代码到底还会会走呢?如果finally中的代码走了的话,return返回的结果又是什么?

我们来开一下调用此方法输出的结果:

我们可以看到finally块即使catch块有return他还是会被执行的

我们再来开下面一个例子

  1        static int txt(){
2 try {
3
4 int a=5/0;
5
6
7 } catch (Exception e) {
8 System.out.println("catch");
9 return 2;
10 }finally{
11 System.out.println("finally");
12 return 3;
13 }
14
15 }

demo

这时return返回的又是多少呢?

话不多时来看结果吧:

我们可以这摸理解:我们定义一个有返回值类型的方法时系统会自动声明一个堆栈上的内存地址用来存放此方法返回的值这也是我们定义一个有返回值类型的方法却没有给定返回值是产生编译错误的原因!当程序执行到catch块的return时会吧return后面的值存放在事先声明的堆栈内存中并不结束此方法后再执行finally块的代码,但是finally块中也有return关键字所以在事先声明的堆栈内存中保存的值也就变成了finally块中return后面的值。又因为finall块后有没有强制执行的代码块所以此方法结束。

以上内容为个人理解如有 不足之处请各位大神多多指正。

思考:

  1        static int txt(){
2 int a=1;
3 try {
4
5 a++;
6 return a;
7
8 }finally{
9 ++a;
10 }
11 }

demo

此方法的返回值是多少。

java中return在Try-Catch中的执行顺序的更多相关文章

  1. 【Java疑难杂症】有return的情况下try catch finally的执行顺序

    有这样一个问题,异常处理大家应该都不陌生,类似如下代码: public class Test { public static void main(String[] args) { int d1 = 0 ...

  2. 【转】C# 异常处理 throw和throw ex的区别 try catch finally的执行顺序(return)

    [转]throw和throw ex的区别 之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查 ...

  3. Javascript中页面加载完成后优先执行顺序

    Javascript中页面加载完成后优先执行顺序 document优先于windowwindow优先于element //document加载完成执行方法体 document.addEventList ...

  4. java中 try catch finally和return联合使用时,代码执行顺序的小细节

    代码1测试 public static void main(String[] args) { aa(); } static int aa() { try { int a=4/0; } catch (E ...

  5. 一个问题:关于finally中return吞掉catch块中抛出的异常

    今天遇到一个感觉很神奇的问题,记录一下问题以及自己分析问题的思路. 预警:不知道怎么看java字节码的朋友可能需要先看一下如何阅读java字节码才能看懂后面的解释. 我有一段程序: public cl ...

  6. Java中try catch finally的执行顺序问题

    finally 语句块是在 try 或者 catch 中的 return 语句之前执行的.更加一般的说法是,finally 语句块应该是在控制转移语句之前执行,控制转移语句除了 return 外,还有 ...

  7. java-try catch中return在finally之前 还是之后执行

    finally语句在return语句执行之后return返回之前执行的. finally块中的return语句会覆盖try块中的return返回. 如果finally语句中没有return语句覆盖返回 ...

  8. Java基础知识强化之IO流笔记06:有return的情况下try catch finally的执行顺序

    1. 给出结论: (1)不管有木有出现异常,finally块中代码都会执行:(2)当try和catch中有return时,finally仍然会执行:(3)finally是在return后面的表达式运算 ...

  9. C#中try catch finally的执行顺序

    1.首先明确一点,就是不管怎样,finally一定会执行,即使程序有异常,并且在catch中thorw 了 ,finally还是会被执行. 2.当try和catch中有return时,finally仍 ...

  10. 【Java基础】继承中的代码块和构造方法的执行顺序探索

    本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题.首先来看一个例子 /** * Created by lili on 15/10/19. */ class Person{ stati ...

随机推荐

  1. Kafka.net使用编程入门

    最近研究分布式消息队列,分享下! 首先zookeeper  和 kafka 压缩包 解压 并配置好! 我本机zookeeper环境配置如下: D:\Worksoftware\ApacheZookeep ...

  2. EF Code First 使用 代码优先迁移(二)

    第一步:如果不是建立的MVC项目,可能需要在控制台输入 :Install-Package EntityFramework 删除之后在执行Enable-Migrations 第二步:添加你需要修改的属性 ...

  3. win7(32位)旗舰版共享HP1010打印机给WINXP专业版

    一.状况: 两台电脑,同一网段内,电脑A是WIN7系统(32位),电脑B是WINXP系统. ①电脑A(win7)已经安装完打印机驱动,能正常打印,对该打印机HP1010共享时,提示“无法保存打印机设置 ...

  4. SpringMVC(六)POJO类作为 @RequestMapping方法的参数

    Command or form objects to bind request parameters to bean properties (via setters) or directly to f ...

  5. Unity脚本生命周期 图解

    简单总结的话就是: Awake():初始化时执行,类似c#中的构造函数 OnEnable() Start() FixUpdate() Update() OnDisable() OnDestory() ...

  6. hp soap扩展最全说明,附天气预报调用的例子

    自从php5开始,我们可以不用通过php nusoap来创建php soap web service 和调用 soap了,php5内置了 soap扩展.只需要在php.ini中开启soap的exten ...

  7. MVC总结

    一.转自https://zhuanlan.zhihu.com/p/35680070 MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来, ...

  8. tp 在Nginx上各种404

    对于ThinkPHP的URL访问路劲如:http://域名/index.php/Index/BlogTest/read,原先的Nginx的是不支持的pathinfo路劲的,导致你在thinkPHP5上 ...

  9. Mysql学习总结(34)——Mysql 彻底解决中文乱码的问题

    mysql 中常常出现对中文支持不友好的情况 常见的错误 "Illegal mix of collations for operation" 下面我们规整一下 mysql 数据库中 ...

  10. table的创建

    results为table的行信息 columnNames  是table列名 //创建并初始化table: table =new JTable(results,columNames); //设置ta ...