博客
关于我
finally面试常问
阅读量:735 次
发布时间:2019-03-21

本文共 2011 字,大约阅读时间需要 6 分钟。

1. finally 语句的执行条件及例外情况

在编程中,finally 语句的执行机制是关键,当 trycatch 块中遇到异常或正常返回时,finally 块都会执行,除非在代码中使用 System.exit(0)。以下是几点需要注意的:

  • 一般情况下的执行:当 try 块正常执行时,返回值传回调用者,或者抛出异常进入 catch 块时,finally 块会在异常处理或正常返回后被执行。

  • 不执行的情况:唯一的例外是当代码中直接调用 System.exit(0),这种情况下 JVM 会立即终止执行流程,导致 finally 语句无法执行。

例如,在以下代码中:

public class Demo8 {    public static void main(String[] args) {        haha();    }    public static void haha() {        try {            int a = 10;            int b = 0;            System.out.println(a / b);        } catch (Exception e) {            // 退出JVM            System.out.println("出现异常");            System.exit(0); // 唯一导致 finally 不执行的情况            // 参数0表示正常退出,非零表示非正常退出        } finally {            System.out.println("xxxxxxxxxx");        }    }}

haha() 调用 System.out.println(a / b) 时,由于除法为零会抛出 ArithmeticException,进入 catch 块。然后执行 System.exit(0),导致程序退出,而 finally 块不会执行。

2. 可变量值的分析

情况一:基本数据类型的返回

在以下代码中:

public static void main(String[] args) {    int a = haha();    System.out.println(a);}public static int haha() {    try {        int a = 10;        return a;    } catch (Exception e) {    } finally {        a = 20;    }    return 0;}

分析:在 haha() 方法中,try 块不抛出异常,直接在 try 内返回 a。此时,因为 try 块没有异常,finally 块会在返回前被执行。finally 块中修改 a,但 a 是在 try 块中定义的变量。由于Java允许在非异常情况下进行一次返回,而 finally 在返回前会执行,所以无论返回时的 a 引用如何,最终返回的值都将是 try 中最初的 a 值,即 10。

情况二:对象引用类型的修改

在以下代码中:

public static void main(String[] args) {    Person p = haha();    System.out.println(p.age);}public static Person haha() {    try {        Person p = new Person();        p.age = 18;        return p;    } catch (Exception e) {        return null;    } finally {        p.age = 28;    }}static class Person {    int age;}

分析:由于 Person 是一个引用类型,haha() 方法返回的是对象 p 的引用。当 try 块结束后,finally 块会在返回前修改 p.age。虽然 try 块中创建了 p 对象,并将其赋值给调用者,但 finally 块修改的是堆中的对象 p,而不仅仅是栈中的引用。因此,当调用者访问 p.age 时,其值将是 28,而不是 try 块中的 18。

图片分析:

  • 堆和栈存储机制
    • 堆用于存储对象及其引用信息,而栈用于存储基本数据类型和方法调用信息。finally 语句修改的是堆中的对象数据,因此即使返回了引用,对象的内存也已经被修改过。

这些知识点突显了基本类型值的传递和返回方式的区别,以及 finally 语句执行机制对于不同数据类型的影响。

转载地址:http://rjagz.baihongyu.com/

你可能感兴趣的文章
opencv29-轮廓周围绘制矩形框和圆形框
查看>>
OpenCV3 install tutorial for Mac
查看>>
opencv3-Mat对象
查看>>
opencv30-图像矩
查看>>
opencv32-基于距离变换和分水岭的图像分割
查看>>
opencv4-图像操作
查看>>
opencv5-图像混合
查看>>
opencv6-调整图像亮度和对比度
查看>>
opencv7-绘制形状和文字
查看>>
opencv8-图像模糊
查看>>
opencv9-膨胀和腐蚀
查看>>
OpenCV_ cv2.imshow()
查看>>
opencv_core.dir/objects.a(vs_version.rc.obj)‘ is incompatible with i386:x86-64 output
查看>>
opencv——图像缩放1(resize)
查看>>
opencv——最简单的视频读取
查看>>
Opencv——模块介绍
查看>>
OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?
查看>>
OpenCV与AI深度学习 | CIB-SE-YOLOv8: 优化的YOLOv8, 用于施工现场的安全设备实时检测 !
查看>>
OpenCV与AI深度学习 | CoTracker3:用于卓越点跟踪的最新 AI 模型
查看>>
OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法
查看>>