在 Java 的异常处理中,try、catch 和 finally 是按顺序执行的。

  • 如果 try 中没有异常,则顺序为 try→finally,
  • 如果 try 中有异常,则顺序为 try→catch→finally。

但是当 try、catch、finally 中加入 return 之后,return 和 finally 的执行顺序让很多人混淆不清。下面来分别说明一下。

1. try 和 catch 中带有 return

1)try 中带有 return,先是finally,再是try里的return

public class tryDemo {public static int show() {try {return 1;} finally {System.out.println("执行finally模块");}}public static void main(String args[]) {System.out.println(show());}
}

输出结果如下:

执行finally模块
1

2)try 和 catch 中都带有 return ,先是finally,再是catch

public class tryDemo {public static int show() {try {int a = 8 / 0;return 1;} catch (Exception e) {return 2;} finally {System.out.println("执行finally模块");}}public static void main(String args[]) {System.out.println(show());}
}

输出结果为:

执行finally模块
2

当 try 代码块或者 catch 代码块中有 return 时,finally 中的代码总会被执行,且 finally 语句 return 返回之前执行

2. finally 中带有 return**,先是finally,再是finally的return

public class tryDemo {public static int show() {try {int a = 8 / 0;return 1;} catch (Exception e) {return 2;} finally {System.out.println("执行finally模块");return 0;}}public static void main(String args[]) {System.out.println(show());}
}

输出结果如下:

执行finally模块
0

当 finally 有返回值时,会直接返回该值,不会去返回 try 代码块或者 catch 代码块中的返回值

注意:finally 代码块中最好不要包含 return 语句,否则程序会提前退出。

3. finally 中改变返回值

下面先来看 try 代码块或者 catch 代码块中的返回值是普通变量时,代码如下:
返回finally,return的result的值不变

public class tryDemo {public static int show() {int result = 0;try {return result;} finally {System.out.println("执行finally模块");result = 1;}}public static void main(String args[]) {System.out.println(show());}
}

输出结果为:

执行finally模块
0

由输出结果可以看出,在 finally 代码块中改变返回值并不会改变最后返回的内容

当返回值类型是引用类型时,结果也是一样的,代码如下:

public class tryDemo {public static Object show() {Object obj = new Object();try {return obj;} finally {System.out.println("执行finally模块");obj = null;}}public static void main(String args[]) {System.out.println(show());}
}

输出结果为:

执行finally模块
java.lang.Object@15db9742

当 try 代码块或 catch 代码块中的 return 返回值类型为普通变量或引用变量时,即使在后面 finally 代码块中对返回值的变量重新赋值,也不会影响最后返回的值。

总结为以下几条:

  • 当 try 代码块和 catch 代码块中有 return 语句时,finally 仍然会被执行。
  • 执行 try 代码块或 catch 代码块中的 return 语句之前,都会先执行 finally 语句。
  • 无论在 finally 代码块中是否修改返回值,返回值都不会改变,仍然是执行 finally 代码块之前的值。
  • finally 代码块中的 return 语句一定会执行。

1.8 finally和return的执行顺序相关推荐

  1. finally代码块和return的执行顺序问题

    为什么80%的码农都做不了架构师?>>>    如题所述,写了个方法验证: public int add(int a,int b){ int i = 0; try{ if(i< ...

  2. java中finally和return的执行顺序

    注意:return的位置... 从这几个例子中可以看到,如果try之前没有有条件的return,则try..catch..finally语句块中的语句都是顺序执行(如果try中或者catch中 有re ...

  3. Java 中 finally 与 return 的执行顺序详解

    java方法是在栈幀中执行,栈幀是线程私有栈的单位,执行方法的线程会为每一个方法分配一小块栈空间来作为该方法执行时的内存空间,栈幀分为三个区域: 1 . 操作数栈,用来保存正在执行的表达式中的操作数, ...

  4. java catch中 return_JAVA中try、catch、finally带return的执行顺序总结

    try catch  以后只要没有抛出新异常或者return,代码会继续往下执行的. 异常处理中,try.catch.finally的执行顺序,大家都知道是按顺序执行的.即,如果try中没有异常,则顺 ...

  5. try catch finally return的执行顺序与返回值探究

    下午看了一下百度文库中下载下来的java笔试题,其中一道就是关于这个问题的,所以写了个测试程序验证了一下,另外具体的理论知识搜罗了网上的资料. 测试程序如下: package com.andy.cod ...

  6. Java的finally执行顺序_Java return和finally执行顺序

    在Java语法中,return表示当前执行的结束,finally则是在当前代码块一定会执行的代码块.如果return在finally在之前执行,finally也会执行吗?答案是肯定的! 但是,fina ...

  7. 从零开始学前端:作用域、执行顺序 --- 今天你学习了吗?(JS:Day9)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(JS) 复习:从零开始学前端:函数 - 今天你学习了吗?(JS:Day8) 文章目录 从零开始学前端:程序猿小白也可以完全掌握!-今天你学 ...

  8. java子类代码块_java中父类子类静态代码块、构造代码块执行顺序

    父类静态(代码块,变量赋值二者按顺序执行) 子类静态 父类构造代码块 父类构造方法 子类构造代码块 子类构造方法 普通方法在实列调用的时候执行,肯定位于上面之后了 //父类A public class ...

  9. 各种有return的情况下try-catch-finally的执行顺序

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

最新文章

  1. Xcode使用正则表达式替换
  2. tornado上传图片
  3. toolstripmanager --工具栏或菜单的合并
  4. 观察者-学历差距造成的差距有多大
  5. c++输入回车结束循环,C++ cin如何输入回车停止
  6. Nexus3 功能介绍
  7. 简约竞聘个人简历自我介绍PPT模板
  8. 「POJ2826」An Easy Problem?!【计算几何】
  9. 常见路由器开源系统(固件)简介
  10. PS改变背景图片/颜色(3种方法)
  11. Linux 查看quota状态,Linux命令之quota详解
  12. ccf 地铁修建spfa (得分85到100)
  13. 华为手环6鸿蒙,智能手环盘点:华为手环6比小米手环6贵在哪?
  14. xtrabackup 问题“Too many open files”system error number 24
  15. 网络编程之一泡尿的时间,快速读懂QUIC协议
  16. arm-2d是个啥?初体验!
  17. 论文阅读笔记之——《FishNet: A Versatile Backbone for Image, Region, and Pixel Level Prediction》
  18. 怎么在markdown中使用上标、下标?
  19. 史上最新 PHP 调用 jar包教程
  20. 海康、大华IpCamera RTSP地址和格式详解

热门文章

  1. Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)
  2. pandas 中有关isin()函数的介绍,python中del解释
  3. Windows Defender还原误删文件
  4. [转帖]最值得了解的10大开源技术
  5. Windows 10 安装 Docker for Windows
  6. a, b = b, a+b
  7. Java网络编程及安全
  8. 【转】浅谈MS-SQL锁机制
  9. _tcscpy_s函数引发的问题
  10. stm32f102 SPI口重复初始化引起的问题及解决办法