码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【面试题精讲】finally 中的代码一定会执行吗?


    文章目录

      • finally 块的作用
      • finally 中的代码一定会执行吗?
        • 1. `System.exit()` 导致 JVM 终止
        • 2. 无限循环或死锁
        • 3. 程序被强制终止
      • 示例代码演示
        • 示例 1:正常情况下执行 finally 块
        • 示例 2:发生异常时执行 finally 块
        • 示例 3:System.exit() 导致 JVM 终止
        • 示例 4:无限循环导致 finally 块无法执行
      • 总结

    在这里插入图片描述

    🎉欢迎来到Java面试技巧专栏~【面试题精讲】finally 中的代码一定会执行吗?


    • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
    • ✨博客主页:IT·陈寒的博客
    • 🎈该系列文章专栏:Java面试技巧
    • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
    • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
    • 📜 欢迎大家关注! ❤️

    在Java编程中,try-catch-finally是一种常见的异常处理机制。finally块用于编写无论是否发生异常都必须执行的代码。然而,在一些情况下,finally中的代码并不一定会执行,这可能会在面试中成为一个常见的问题。本文将深入探讨finally中代码的执行情况,并提供一些示例以帮助你更好地理解。

    在这里插入图片描述

    finally 块的作用

    首先,让我们回顾一下finally块的作用。finally块是try-catch-finally异常处理结构的一部分,它用于包含必须在try块或catch块执行之后无论是否发生异常都要执行的代码。通常,它用于释放资源、关闭文件、数据库连接等清理工作,以确保不会发生资源泄漏等问题。

    下面是一个简单的示例,演示了finally块的基本用法:

    FileInputStream inputStream = null;
    try {
        inputStream = new FileInputStream("example.txt");
        // 执行一些操作
    } catch (IOException e) {
        // 处理异常
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                // 处理关闭文件时的异常
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在上面的代码中,finally块用于确保inputStream被关闭,即使在try块中发生了异常。

    finally 中的代码一定会执行吗?

    现在,让我们来探讨一个更复杂的问题:finally中的代码一定会执行吗?答案是大多数情况下是的,但也存在一些特殊情况。

    1. System.exit() 导致 JVM 终止

    在Java中,如果在try或catch块中调用了System.exit(int status)方法,它将导致JVM终止,即Java虚拟机将立即退出。在这种情况下,finally块中的代码将不会执行,因为JVM已经停止了。

    以下是一个示例:

    try {
        // 一些操作
        System.exit(0); // JVM 将终止
    } finally {
        // 这里的代码不会执行
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2. 无限循环或死锁

    如果在try块中存在无限循环或死锁,导致程序无法正常退出,那么finally块中的代码也将无法执行。

    以下是一个示例,演示了无限循环导致finally块无法执行的情况:

    try {
        while (true) {
            // 无限循环
        }
    } finally {
        // 这里的代码不会执行
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在上述示例中,由于无限循环,程序将无法正常退出,finally块中的代码将永远无法执行。

    3. 程序被强制终止

    如果在运行Java程序时,操作系统或外部进程强制终止了程序,finally块中的代码同样不会执行。这通常发生在操作系统出现故障、内存不足或管理员手动终止进程的情况下。

    总之,finally块中的代码在大多数情况下都会执行,但在某些特殊情况下可能不会执行,需要注意这些情况以确保程序的稳定性和可靠性。

    示例代码演示

    下面我们通过一些示例代码来进一步说明finally块的执行情况。

    示例 1:正常情况下执行 finally 块

    public class FinallyExample1 {
        public static void main(String[] args) {
            try {
                System.out.println("Try block");
            } finally {
                System.out.println("Finally block");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    上述代码中,没有发生异常,正常执行finally块,输出如下:

    Try block
    Finally block
    
    • 1
    • 2

    示例 2:发生异常时执行 finally 块

    public class FinallyExample2 {
        public static void main(String[] args) {
            try {
                System.out.println("Try block");
                int result = 1 / 0; // 除以零,抛出异常
            } catch (ArithmeticException e) {
                System.out.println("Catch block");
            } finally {
                System.out.println("Finally block");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    上述代码中,发生了算术异常,但在进入catch块之前,仍然执行了finally块,输出如下:

    Try block
    Finally block
    Exception in thread "main" java.lang.ArithmeticException: / by zero
    	at FinallyExample2.main(FinallyExample2.java:6)
    
    • 1
    • 2
    • 3
    • 4

    示例 3:System.exit() 导致 JVM 终止

    public class FinallyExample3 {
        public static void main(String[] args) {
            try {
                System.out.println("Try block");
                System.exit(0); // JVM 将终止
            } finally {
                System.out.println("Finally block");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上述代码中,调用了System.exit(0)方法,导致JVM终止,finally块不会执行,输出如下:

    Try block
    
    • 1

    示例 4:无限循环导致 finally 块无法执行

    public class FinallyExample4 {
        public static void main(String[] args) {
            try {
                System.out.println("Try block");
                while (true) {
                    // 无限循环
                }
            } finally {
                System.out.println("Finally block");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    上述代码中,由于存在无限循环,程序无法正常退出,finally块无法执行,输出如下:

    Try block
    
    • 1

    总结

    finally块是一种用于编写必须在try或catch块执行之后无论是否发生异常都要执行的代码的有用机制。大多数情况下,finally块中的代码都会执行,但在某些特殊情况下,如调用System.exit()、无限循环或程序被强制终止时,finally块中的代码可能不会执行。因此,在编写代码时,应该注意这些情况,以确保程序的可靠性和稳定性。希望本文对你更好地理解finally块的执行情况有所帮助。


    🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
    📜您可能感兴趣的内容:

    • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
    • 【Java学习路线】2023年完整版Java学习路线图
    • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
    • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
    • 【数据结构学习】从零起步:学习数据结构的完整路径

    在这里插入图片描述

  • 相关阅读:
    js面试题==和===
    绕过伪静态
    java计算机毕业设计剧院售票系统源码+mysql数据库+系统+lw文档+部署
    webmin远程命令执行漏洞
    【Flink metric(1)】Flink指标系统的系统性知识:获取metric以及注册自己的metric
    【BigDecima】不可变的,任意精度的有符号十进制数。
    【专栏】RPC系列(番外)-“土气”的IO实现
    WEBGPU学习之通过javascript代码修改顶点着色器的顶点数据。
    AUTOSAR规范与ECU软件开发(实践篇)10.5、Adaptive AUTOSAR平台新概念介绍
    基于istio实现单集群地域故障转移
  • 原文地址:https://blog.csdn.net/qq_43546721/article/details/133761974
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号