Java基础——finally return执行的先后顺序

【finally里面的代码是在return之前还是之后】 阅读详情

先给出结论:

return——>finally——>return

return语句先执行,不过没有立即返回,而是去执行finally语句,等finally语句执行完了,return语句再返回结果!

 

具体请看以下描述:

有两种情况下finally语句是不会被执行的:

(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。

(2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

 

 

1. finally语句在return语句执行之后return返回之前执行的。

 

 

public class FinallyTest1 {

    public static void main(String[] args) {
        
        System.out.println(test1());
    }

    public static int test1() {
        int b = 20;

        try {
            System.out.println("try block");

            return b += 80; 
        }
        catch (Exception e) {

            System.out.println("catch block");
        }
        finally {
            
            System.out.println("finally block");
            
            if (b > 25) {
                System.out.println("b>25, b = " + b);
            }
        }
        
        return b;
    }
    
}

 

运行结果是:

try block
finally block
b>25, b = 100
100


说明return语句已经执行了再去执行finally语句,不过并没有直接返回,而是等finally语句执行完了再返回结果。

 

 

 

如果觉得这个例子还不足以说明这个情况的话,下面再加个例子加强证明结论:

 

public class FinallyTest1 {

    public static void main(String[] args) {
        
        System.out.println(test11());
    }
    
    public static String test11() {
        try {
            System.out.println("try block");

           return test12();
      } finally {
           System.out.println("finally block");
       }
  }

  public static String test12() {
       System.out.println("return statement");

       return "after return";
   }
    
}

 

 

 

 

 

 

运行结果为:

try block
return statement
finally block
after return


说明try中的return语句先执行了但并没有立即返回,等到finally执行结束后再返回

 

 

 

 

这里大家可能会想:如果finally里也有return语句,那么是不是就直接返回了,try中的return就不能返回了?看下面

 

2.finally块中的return语句会覆盖try块中的return返回。

 

 

public class FinallyTest2 {

    public static void main(String[] args) {

        System.out.println(test2());
    }

    public static int test2() {
        int b = 20;

        try {
            System.out.println("try block");

            return b += 80;
        } catch (Exception e) {

            System.out.println("catch block");
        } finally {

            System.out.println("finally block");

            if (b > 25) {
                System.out.println("b>25, b = " + b);
            }

            return 200;
        }

        // return b;
    }

}

 

 

 

 

 

 

运行结果是:

try block
finally block
b>25, b = 100
200

 

 

 

 

 

这说明finally里的return直接返回了,就不管try中是否还有返回语句,这里还有个小细节需要注意,finally里加上return过后,finally外面的return b就变成不可到达语句了,也就是永远不能被执行到,所以需要注释掉否则编译器报错。

 

 

3. 如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。

public class FinallyTest3 {

    public static void main(String[] args) {

        System.out.println(test3());
    }

    public static int test3() {
        int b = 20;

        try {
            System.out.println("try block");

            return b += 80;
        } catch (Exception e) {

            System.out.println("catch block");
        } finally {

            System.out.println("finally block");

            if (b > 25) {
                System.out.println("b>25, b = " + b);
            }

            b = 150;
        }

        return 2000;
    }

}

 

 

 

 

 

 

运行结果是:

try block
finally block
b>25, b = 100
100

 

 

 

 

 

Java中只有传值没有传址,这同时也说明了返回语句是try中的return语句而不是 finally外面的return b;这句,不相信的话可以试下,将return b;改为return 294,对原来的结果没有一点影响。

 

 

 

Java中的return和finally语句的执行顺序 在上面的示例中,我们定义了一个divide方法,它接受两个整数作为参数,并返回它们的商。总结一下,无论是否发生异常,finally语句块中的代码都将被执行。在发生异常时,异常会被捕获并相应的代码块执行,然后finally语句块被执行,最后异常被传播到调用该方法的代码中。在Java中,return和finally是两个常用的关键字,用于控制程序的执行流程和资源的释放。通过正确理解和使用return和finally语句,我们可以更好地控制程序的执行流程和资源的释放,确保代码的正确性和可靠性。 阅读详情

相关推荐

Android 默认授予所有应用权限以及特殊权限处理

PackageManagerService作为android的主要系统服务之一,包含处理应用权限相关的职责。源码地址如下:在PMS成功启动时并收到回掉systemReady回进行应用权限授予。DefaultPermissionGrantPolicy为权限处理策略管理类。这里并没有赋予所有系统应用权限,所以当进行应用时还是会显示权限检查的弹框。可通过此方法进行所有应用权限赋予:如果不想所有应用都授予权限,可考虑在system/etc下的权限相关xml文件添加应用包名和所需权限。

Jimmy的专栏 1509

finally 和 return 的执行顺序

代码一: 运行结果如下: 从上述运行结果来看,在执行到之前先运行了代码,为什么会是这样的呢?我们可以看看编译后的代码如下: 发现编译后 被优化了放到了后面,中间都是用临时变量存储的,所以自然而然执行顺序就是先输出然后执行。同时也是表示这个方法运行完准备退出。 代码二: 运行结果如下: 为什么是这样的输出结果,我们查看编译后的代码如下所示: 还是因为代码自动优化了。代码三: 运行结果如下所示: 看完运行结果我们看看编译后的代码如下所示: 从这里可以看出只要在中加了代码结束符,其他地方的都忽略,在中加就相当于

龚小帅的博客 1645

动态库加载失败终极指南:从libbz2.so.1错误看Linux依赖管理本质

本文以经典的libbz2.so.1加载错误为例,深入剖析Linux动态链接库管理的核心机制。文章不仅提供从ldd检查、符号链接创建到LD_LIBRARY_PATH设置等实战解决方案,更系统性地讲解了动态链接器的寻库路径、版本管理及依赖问题预防策略,帮助开发者从根本上理解和掌握Linux依赖管理本质。

weixin_29212429的博客 447

Java中finally和return的执行顺序

Java中finally和return语句执行顺序

我要成为Java糕手 2299

ESP8266入门(一)固件烧录及常见问题分析

为了实现对数据的远程收集和分析,偶然间发现了esp8266这个模块,对此进行了深入的学习,可是在学习之初遇到了大量的问题,这个系列文章就为大家讲讲我遇到的坑以及解决办法,还有esp8266如何连上oneNet云平台的方法。因为我用的是esp8266nodemcu,可以直接连接usb进行烧录,如果用模块的话接线就比较麻烦,可以去搜搜看.

Jerryxuzherui的博客 8955

il2cpp分析-gobal-metadata.dat解密

打开ida,把libil2cpp拖到ida中按快捷键Shift+F12等待字符串分析完后,搜索global-metadata.dat。ida中双击sub_57EE7C进入,VS code中也跳转到LoadMetadataFile函数。VSCode打开il2cpp源代码,全局搜索global-metadata.dat。工具:010Editor,IDA 7.5,Jadx,VS Code。判断加密逻辑为根据文件的长度循环读取字节码做亦或加密。双击搜索出来的结果,切记要选il2cpp目录下的。

Android_machong的博客 8024

Android面试之java基础try-catch-finally-return的执行先后顺序问题

还是一个被个程序猿们讨论多时的问题,也是众软件公司面试题中很钟情的一个问题,更是一个考查程序猿对Java基础知识掌握理解程度的问题,就是本文要说的try-catch-finally-return的执行先后顺序问题 先说明几个原则 。 1、不论是否能捕捉到异常,finally块中代码都会执行; 2、当try和catch中有return时,finally仍然会执行; 3、fin

yzppp 1719

五万字解析【ROOT 入门指南】

本文是cern官方root入门指南的初步翻译版,还在进一步校对中....

荷塘阅色 208

Java中finally和return执行顺序

总结: 1 finally语句在return语句执行之后return返回之前执行的 2 finally块中的return语句会覆盖try块中的return返回 3 如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变 4 try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况 5 当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全

大灰狼的专栏 1万+

Allegro输出光绘文件规范

添加钻孔表的具体步骤为:1.通过屏幕右边的Visibility选项的Views列表,将Drill层打开2.将Visibility选项中的PIN和Via选项都选中,见下图所示: 参数设好之后关闭NC Drill/Parameters窗口,输出数控机床钻孔文件的命令菜单为:Manufacture=>NC=>NC Drill…,打开的窗口如下: 输出数控机床钻孔文件的具体步骤为: 上图是光绘输出的层控制窗口,还有一个窗口是输出参数的控制窗口,我们通过点击上图的第二个列表项General Parameters来

axingxiansen的博客 2808

NLP高频面试题(一)——Transformer的基本结构、作用和代码实现

本文详细介绍了Transformer模型的基本结构和PyTorch代码实现过程。首先解析了Transformer的核心组成部分,包括嵌入层、多头自注意力机制、位置编码、前馈神经网络、编码器和解码器等模块,并通过清晰的代码示例逐步展示了如何在PyTorch中构建完整的Transformer模型。文末提供了一个可运行的简单示例,帮助读者快速理解并实践Transformer的核心原理与实现方法。

WeLearnNLP 1026

Java中finally与return的执行顺序

在Java的异常处理中,try、catch 和 finally 是按顺序执行的。如果 try 中没有异常,则顺序为 try→finally,如果 try 中有异常,则顺序为 try→catch→finally。但是当 try、catch、finally 中加入 return 之后,return 和 finally 的执行顺序让很多人混淆不清。下面来分别说明一下。 1. try 和 catch 中带有return 1)try 中带有 return public class tryDemo { ...

骏马逸动,心随你动的博客 8638

西门子 S7-1200 G2 高速计数器的使用方法介绍

西门子 S7-1200 G2 高速计数器的使用方法介绍

Robot_PLC_HMI_Automation 1697

Java finally语句到底是在return之前还是之后执行?

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被

程序媛想事儿 4800

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

try中有return,finally还会执行吗?

本篇文章我们主要探讨 一下如果try {}语句中有return,这种情况下finally语句还会执行吗?其实JVM规范是对这种情况有特殊规定的,那我就先上代码吧! public class FinallyTest { public int method() { int x = 1; try{ ++ x; r...

Hningning的博客 4222

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

return 后 finally 还执行吗

一直有一个疑问:在 try - catch 中加了 return 后,finally 还执行吗?接下来我们来测试一下。 1. 在 try 中加 return 测试代码如下: public class Finally { public static String method() { try { return "我是 try"; } catch (Exception e) { } finally {

明月燃雨 4184

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

关于Java finally的面试题(finally的执行时机,finally和return的先后顺序)

** 关于Java finally的面试题(finally的执行时机,finally和return的先后顺序) ** 面试官问题: 什么时候用到finally呢?finally语句在try或catch中的return语句执行之后,还是return返回之前执行呢? 在try{}catch{}捕获异常处理语句中: finally{}必然执行的异常统一处理出口,无论是否发生异常,finally必然执行 除非程序被关闭了 finally才不会执行 电脑关机了 软件在内存里没了 否则finally必然执行

Thinking_Key的博客 496

Java中finally块到底是在return之前执行还是return之后执行?

try block finally block b>25, b = 100 100

sinat_42759524的博客 1028

finally到底是在return之前执行还是return之后执行?

1、finally是在return语句执行之后,return语句返回之前,finally是必执行的(当然是建立在try执行的基础上); 2、finally中修饰的基本类型没有return是不影响返回结果的,有了return才会影响返回结果; 3、finally中修改set、list、map引用类型时,就算没有return也会影响返回结果; package com; import java...

by_xiaobai007的博客 1565

java中finally和return,Java中finally与return的执行顺序

Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?从实践来看,至少在两种场合下,是不会被执行的。(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。(2)在try块中有System.exit(0);这样的语句,Sys...

weixin_35068077的博客 376

finally在return之后也会执行吗

是的,finally块中的代码会在return语句之后执行。在 Java 中,语句块确保finally块总是被执行,无论try块内部发生了什么情况——无论是正常结束、遇到return语句还是抛出异常。这种行为使得finally块成为执行清理工作的理想位置,例如关闭文件、释放资源或其他必须执行的清理操作。

m0_57236802的博客 2550

【java基础】finally和return的执行顺序,真的理解对了吗?

初学java的时候 大家应该还记得有一句话:最终都会执行finally; 那么时间久了 真正的执行顺序,真的还记得吗? 首先看看csdn中某一篇点击量 赞评都很高的结论,是否发现问题? 同时也反应一个问题 这些基础带细节性的东西,真的很容易被忽略 =分割线================================== 例子1: public class Demo { public static void main(String[] args) { int a = 0;

孟秋与你的博客 538

java中,return是在finally之前还是之后执行。

Java中,return是在finally之前还是之后执行,本人通过如下代码来验证。   public class Tropic{ public static void main(String[] args){ System.out.println("Tropic的值为:"+Calamity.vault()); } }   class Calamity{ static int a

PleaseCallMeWisely的专栏 980

Java中finally 到底是在 return 之前还是之后执行的?

Java中finally 到底是在 return 之前还是之后执行的? 前言 网上有很多人探讨Java中异常捕获机制try…catch…finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了...

一位打工仔的博客 219
上一篇: NC UAP STUDIO授权
下一篇: oracle 11g 导入数据库,表空间超过32G的解决办法
冷静BB
博客等级 码龄12年 298粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值