Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >106.Java 中的 finally 一定会执行吗

106.Java 中的 finally 一定会执行吗

作者头像
用户11332765
发布于 2024-11-01 09:10:42
发布于 2024-11-01 09:10:42
6500
代码可运行
举报
文章被收录于专栏:编程编程
运行总次数:0
代码可运行
Java 中的 finally 一定会执行吗

一、前言

因为这次面试有问到一些同学finally的问题,发现自己这块好像有点记不太清楚了,有的点可能还给人家说错了,一度弄得场面有些尴尬。所以说这篇文章深入研究一下finally的执行情况和返回值的情况。

二、finally一定会执行吗?

先给答案:肯定不是。

我们可以看两种情况:

1.在执行try块之前直接return,我们发现finally块是不会执行的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TryCatchTest {

    private static int total() {
        int i = 11;
        if (i == 11) {
            return i;
        }
        try {
            System.out.println("执行try");
        } finally {
            System.out.println("执行finally");
        }
        return 0;
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + total());
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输出结果:
执行main:11
复制代码

2.在执行try块之前制造一个错误,直接爆红

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TryCatchTest {

    private static int total() {
        return 1 / 0;
        try {
            System.out.println("执行try");
        } finally {
            System.out.println("执行finally");
        }
        return 0;
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + total());
    }
}

综上我们看出,如果程序连try块都执行不到,那么finally块自然就不会执行到了

不过这里有的同学就会问:如果执行了try块,finally块一定会执行吗?有的同学答案就是一定会,其实非然,看看下面的例子吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TryCatchTest {

    private static int total() {
        try {
            System.out.println("执行try");
            System.exit(0);
        } catch (Exception e) {
            System.out.println("执行catch");
        } finally {
            System.out.println("执行finally");
        }
        return 0;
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + total());
    }
}

输出结果: 执行try

我们在执行try块之中退出jvm,就没事了,都不执行了。当然这个情况是比较极端的,记住就行,没事不要乱整这个。最后总结一下:不管是给try块中造了个异常,还是在try块中进行return,我们发现finally块还是会执行的。因为异常处理设计初衷就是让finally块始终执行。这个总结在finally的执行时机得到证明。

三、finally执行时机探讨

首先看常规情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TryCatchTest {

    private static int total() {
        try {
            System.out.println("执行try");
            return 11;
        } finally {
            System.out.println("执行finally");
        }
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + total());
    }
}

输出结果: 执行try 执行finally 执行main:11

分析一下,不难得出在这个例子中finally块执行在try块的return之前。我们给try块中造一个异常:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TryCatchTest {

    private static int total() {
        try {
            System.out.println("执行try");
            return 1 / 0;
        } catch (Exception e) {
            System.out.println("执行catch");
            return 11;
        } finally {
            System.out.println("执行finally");
        }
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + total());
    }
}

输出结果: 执行try 执行catch 执行finally 执行main:11

同样的,finally执行在catch块return的执行前

四、finally块中的返回值

1.finally块不含返回值,但是做改变变量值的操作

看一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TryCatchTest {

    private static int total() {
        int i = 0;
        try {
            System.out.println("执行try:" + i);
            return i;
        } finally {
            ++i;
            System.out.println("执行finally:" + i);
        }
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + total());
    }
}

输出结果: 执行try:0 执行finally:1 执行main:0

如果看完前面分析,会发现跟想象的不太一样。我们经过前面的分析,finally块的执行时机应该是return之前,那理论上我们应该先++i使得i等于1,在执行return i; 自然会返回1。

可是结果却返回了0,这是因为Java程序会把try或者catch块中的返回值保留,也就是暂时的确认了返回值,然后再去执行finally代码块中的语句。等到finally代码块执行完毕后,如果finally块中没有返回值的话,就把之前保留的返回值返回出去。

2.finally中含有返回值

示例1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TryCatchTest {

  private static int total() {
    try {
      System.out.println("执行try");
      return 1;
    } finally {
      System.out.println("执行finally");
      return 2;
    }
  }

  public static void main(String[] args) {
    System.out.println("执行main:" + total());
  }
}

输出结果: 执行try 执行finally 执行main:2


示例2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TryCatchTest {

    private static int total() {
        int i = 1;
        try {
            System.out.println("执行try:" + i);
            return i;
        } finally {
            ++i;
            System.out.println("执行finally:" + i);
            return i;
        }
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + total());
    }
}

输出结果: 执行try:1 执行finally:2 执行main:2

示例3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TryCatchTest {

    private static int total() {
        int i = 1;
        try {
            System.out.println("执行try:" + i);
        } finally {
            ++i;
            System.out.println("执行finally:" + i);
        }
        return i;
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + total());
    }
}

执行结果: 执行try:1 执行finally:2 执行main:2

这三个示例都说明了一点,在分析含有finally块的方法返回值时,要对于return出现的地方进行具体分析。在finally块中进行return操作的话,则方法整体的返回值就是finally块中的return返回值。如果在finally块之后的方法内return,则return的值就是进行完上面的操作后的return值。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
finally代码块中的内容一定执行吗?
执行结果如下,先执行try代码块,如果有异常再执行catch代码块,最后执行finally语句
科技新语
2025/02/18
660
finally代码块中的内容一定执行吗?
Java 的 finally 代码块的代码一定会执行吗?
对于很多初学者而言,会想当然地认为 “finally 代码块一定会被执行”,因此我们可以看下面这个案例:
终码一生
2022/04/14
4610
【面试题精讲】finally 中的代码一定会执行吗?
在Java编程中,try-catch-finally是一种常见的异常处理机制。finally块用于编写无论是否发生异常都必须执行的代码。然而,在一些情况下,finally中的代码并不一定会执行,这可能会在面试中成为一个常见的问题。本文将深入探讨finally中代码的执行情况,并提供一些示例以帮助你更好地理解。
IT_陈寒
2023/12/13
1560
【面试题精讲】finally 中的代码一定会执行吗?
Java 的 finally 代码块的代码一定会执行吗?
对于很多初学者而言,会想当然地认为 “finally 代码块一定会被执行”,因此我们可以看下面这个案例:
明明如月学长
2021/08/31
4360
Java 异常处理中篇:finally 中的陷阱(finally 中 return 会发生什么)
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2023/12/15
5074
【面试题精讲】finally 中的代码一定会执行吗?
finally 块是 Java 中的一个关键字,用于定义在 try-catch 语句中无论是否发生异常都会执行的代码块。finally 块通常用于释放资源、关闭连接或者进行清理操作。
程序员朱永胜
2023/10/10
7690
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了
final 是 Java 中的关键字,它也是 Java 中很重要的一个关键字,final 修饰的类、方法、变量有不同的含义;finally 也是一个关键字,不过我们可以使用 finally 和其他关键字结合做一些组合操作;finalize 是一个不让人待见的方法,它是对象祖宗 Object 中的一个方法,finalize 机制现在已经不推荐使用了。本篇文章,cxuan 就带你从这三个关键字入手,带你从用法、应用、原理的角度带你深入浅出理解这三个关键字。
cxuan
2020/11/03
3340
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了
Java finally语句到底是在return之前还是之后执行?
网上有很多人探讨Java中异常捕获机制try…catch…finally块中的finally语句是不是一定会被执行?
挨踢小子部落阁
2019/08/05
8490
Java关键字 Finally执行与break, continue, return等关键字的关系
长文短总结: 在程序没有在执行到finally之前异常退出的情况下,finally是一定执行的,即在finally之前的return语句将在finally执行之后执行。 finally总是在控制转移语句(break,continue,return等)执行之前执行。 可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机。接下来我就带您一步一步的揭开这个 finally 的神秘面纱。 问题分析 首先来问大家一个问题:finally 语句块一定会执行吗? 很多人都认为 finally
老白
2018/03/19
3.8K0
Java关键字 Finally执行与break, continue, return等关键字的关系
Java finally语句到底是在return之前还是之后执行?
网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的:
bear_fish
2018/09/20
1.3K0
java finally深入探究
When---什么时候需要finally: 在jdk1.7之前,所有涉及到I/O的相关操作,我们都会用到finally,以保证流在最后的正常关闭。jdk1.7之后,虽然所有实现Closable接口的流,可以通过在try块中定义,从而实现jvm自动关闭输入输出流。但其实在我们需要在代码块返回之前,实现在不管前面的操作是否执行成功,都要执行的某操作A。这时候我们就可以将A放入finally块中。很常见的一个操作就是锁的unlock操作。 What---什么是finally: 字面解释就是最终,eventuall
SecondWorld
2018/03/14
7250
由一道 Java finally 执行顺序的题引发的思考
前言 本文讲解过于繁琐,已重新修改至 关于 Java finally 执行顺序 -- 修改版。 原题 首先来看看这道题: public class test1 { static String s = "A"; public static void main(String[] args) { System.out.println(test()); System.out.println(s); } private static String
一份执着✘
2018/06/04
5680
try-catch-finally中的4个大坑,不小心就栽进去了!
在 Java 语言中 try-catch-finally 看似简单,一副人畜无害的样子,但想要真正的“掌控”它,却并不是一件容易的事。别的不说,咱就拿 fianlly 来说吧,别看它的功能单一,但使用起来却“暗藏杀机”,若您不信,咱来看下面的这几个例子...
磊哥
2021/02/02
9920
Java finally 语句到底是在 return 之前还是之后执行?
今天跟大家分享下Java finally语句的知识。finally隐藏了这样的细节?
互扯程序
2019/11/01
1.2K0
【Java疑难杂症】有return的情况下try catch finally的执行顺序
文章介绍了异常处理的原理,总结了解决办法,分析了在实际编程中可能遇到的问题以及解决方法,包括使用try-catch语句和自定义异常。
弗兰克的猫
2018/01/09
6730
finally中的代码一定会执行吗?
通常在面试中,只要是疑问句一般答案都是“否定”的,因为如果是“确定”和“正常”的,那面试官就没有必要再问了嘛,而今天这道题的答案也是符合这个套路。
磊哥
2023/12/19
3790
finally中的代码一定会执行吗?
【Java】try-catch-finally语句中return的执行顺序思考
对于try-catch-finally语句中return的执行顺序,我们都有知道,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因。
用户7886150
2021/04/06
7560
关于 Java finally 执行顺序 -- 修改版
前言 之前写了一篇 关于 try-catch-finally 执行顺序 的文章,但是写的有些繁琐了,这里重新写一下。 题目 class Test { public int aaa() { int x = 1; try { return ++x; } catch (Exception e) { } finally { ++x; } return x;
一份执着✘
2018/06/04
8400
【漫画】finally到底是在return之前执行还是return之后执行?
比如说上面所示的代码,在try语句里面 i / 0 的话会抛出来异常,这样的话程序就在i / 0这里由于抛出了异常,所以程序不会继续往下去执行try包含的语句了。首先进入到catch语句里面,由于finally语句一定会执行,接下来就会执行finally中的语句,所以就得到了上面的执行结果。
乔戈里
2019/01/23
7320
【Java学习笔记之三十三】详解Java中try,catch,finally的用法及分析
这一篇我们将会介绍java中try,catch,finally的用法 以下先给出try,catch用法: try {   //需要被检测的异常代码 } catch(Exception e) { //异常处理,即处理异常代码 } finally {   //一定会被执行的代码 } 代码区如果有错误,就会返回所写异常的处理。 首先要清楚,如果没有try的话,出现异常会导致程序崩溃。而try则可以保证程序的正常运行下去,比如说: try { int i = 1/0; } catch(Exc
Angel_Kitty
2018/04/09
8.6K0
推荐阅读
相关推荐
finally代码块中的内容一定执行吗?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验