try-catch-finally中的4个巨坑,老程序员也搞不定!(4)

简介: try-catch-finally中的4个巨坑,老程序员也搞不定!(4)

③ 解决方案


关于 Java 虚拟机是如何编译 finally 语句块的问题,有兴趣的读者可以参考《The JavaTM Virtual Machine Specification, Second Edition》中 7.13 节 Compiling finally。那里详细介绍了 Java 虚拟机是如何编译 finally 语句块。


实际上,Java 虚拟机会把 finally 语句块作为 subroutine(对于这个 subroutine 不知该如何翻译为好,干脆就不翻译了,免得产生歧义和误解)直接插入到 try 语句块或者 catch 语句块的控制转移语句之前。但是,还有另外一个不可忽视的因素,那就是在执行 subroutine(也就是 finally 语句块)之前,try 或者 catch 语句块会保留其返回值到本地变量表(Local Variable Table)中,待 subroutine 执行完毕之后,再恢复保留的返回值到操作数栈中,然后通过 return 或者 throw 语句将其返回给该方法的调用者(invoker)。


因此如果在 try-catch-finally 中如果有 return 操作,**一定要确保 return 语句只在方法的尾部出现一次!**这样就能保证 try-catch-finally 中所有操作代码都会生效。


④ 正例代码


private static int getValueByAmend() {
    int num = 1;
    try {
        // do something
    } catch (Exception e) {
        // do something
    } finally {
        num++;
    }
    return num;
}


坑3:finally中的代码“非最后”执行


① 反例代码


public static void main(String[] args) throws FileNotFoundException {
    execErr();
}
private static void execErr() {
    try {
        throw new RuntimeException();
    } catch (RuntimeException e) {
        e.printStackTrace();
    } finally {
        System.out.println("执行 finally.");
    }
}

以上代码的执行结果如下:


微信图片_20220120160204.jpg


从以上结果可以看出 finally 中的代码并不是最后执行的,而是在 catch 打印异常之前执行的,这是为什么呢?


② 原因分析


产生以上问题的真实原因其实并不是因为 try-catch-finally,当我们打开 e.printStackTrace 的源码就能看出一些端倪了,源码如下:


微信图片_20220120160224.jpg

相关文章
|
7月前
|
安全 Java 程序员
🚀JAVA异常处理“三部曲”:try-catch-finally带你征服编程的星辰大海!
【6月更文挑战第18天】Java异常处理的`try-catch-finally`是编程探险中的导航系统,确保程序在异常时安全航行。`try`捕获异常,`catch`处理异常,`finally`保证关键清理代码执行。通过实例展示了如何在文件读取中应用这一机制,即使遇到错误也能优雅退出,它是Java程序员征服技术高峰的关键工具。
94 0
|
5月前
|
搜索推荐 大数据 数据处理
面试官:try-catch 到底写在循环里面好,还是外面好?大部分人都会答错!
面试官:try-catch 到底写在循环里面好,还是外面好?大部分人都会答错!
58 0
|
8月前
|
安全 Java 程序员
代码救火队:try-catch-finally带你走出异常困境
代码救火队:try-catch-finally带你走出异常困境
60 0
《C++避坑神器·二十三》C++异常处理exception
《C++避坑神器·二十三》C++异常处理exception
80 0
|
缓存 前端开发 Java
支付宝二面:使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!
支付宝二面:使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!
166 0
支付宝二面:使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!
一个try-catch问出这么多花样【面试题】
一个try-catch问出这么多花样【面试题】
102 0
一个try-catch问出这么多花样【面试题】
|
JSON 缓存 安全
满屏的try-catch,你不瘆得慌?
满屏的try-catch,你不瘆得慌?
|
前端开发 Java Spring
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
280 0
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
|
存储 Oracle Java
try-catch-finally中的4个巨坑,老程序员也搞不定!
在 Java 语言中 try-catch-finally 看似简单,一副人畜无害的样子,但想要真正的“掌控”它,却并不是一件容易的事。别的不说,咱就拿 fianlly 来说吧,别看它的功能单一,但使用起来却“暗藏杀机”,若您不信,咱来看下面的这几个例子...
207 0
try-catch-finally中的4个巨坑,老程序员也搞不定!
读者被问题代码折磨,鸭哥劝 NullPointerException 耗子尾汁!!!
说起来,鸭哥也算是身经百战的码农了,代码习惯和风格都是不错的。没想到,今天大意了没有闪,NullPointerException 就找上门来了。
220 0
读者被问题代码折磨,鸭哥劝 NullPointerException 耗子尾汁!!!