Java try/catch/finally代码块中加入return后的执行顺序问题

try、catch、finally 和 return 的执行关系 finally 块的代码总是会执行,无论 try 块是否有异常,是否有 return,还是程序中抛出了异常。即使 try 或 catch 块中有 return,finally 块也会在 return 之前执行。如果 finally 块中包含 return,它会覆盖 try 或 catch 中的 return 结果,直接返回 finally 的返回值。这些规则保证了 finally 块的执行一致性,但也可能引发一些难以察觉的问题,所以在编写代码时需要特别小心 finally 中的逻辑。 阅读详情

finally可以分两方面理解

1.执行时机问题。finally总会执行(除非是System.exit()),正常情况下在try后执行,抛异常时在catch后面执行

2.返回值问题。可以认为try(或者catch)中的return语句的返回值放入线程栈的顶部:如果返回值是基本类型则顶部存放的就是值,如果返回值是引用类型,则顶部存放的是引用。finally中的return语句可以修改引用所对应的对象,无法修改基本类型。但不管是基本类型还是引用类型,都可以被finally返回的“具体值”具体值覆盖

3.不建议在finally中使用return语句,如果有,eclipse会warning“finally block does not complete normally”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.ljn.base;
 
 
public class FinallyTest {
 
    public static void main(String[] args) {
        System.out.println(test());
        System.out.println(testPrimitive());
    }
 
    public static Student test() {
        Student result = new Student("Tom", 0);
        try {
            result.setAge(1);
            return result;
        } catch (Exception e) {
            result.setAge(2);
            return result;
        } finally {
            result.setAge(3);       //引用类型的返回值,可被修改
            //return new Student("Kobe", 33);   //可以被“具体值”覆盖
        }
         
    }
     
    public static int testPrimitive() {
        int x = 0;
        try {
            x = 1;
            return x;
        } catch (Exception e) {
            x = 2;
            return x;
        } finally {
            x = 3;          //基本类型的返回值,不可被修改
            //return x;    //可以被“具体值”覆盖
        }
         
    }
     
    private static class Student {
        private String name;
        private int age;
         
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
        @Override
        public String toString() {
            return "Student [name=" + name + ", age=" + age + "]";
        }
        public void setAge(int age) {
            this.age = age;
        }
         
    }
}


返回基础类型变量时是值,返回引用类型时是指向某个对象的地址;
而且基础类型是被分配在栈中的,对象是被分配在堆中的,只要有引用指向这个对象,系统就不会回收此对象,
所以可以在后面的finally块中改变引用指向的对象的内容,却无法改变try语句中return要返回的值,因为这个值已经与变量无关了。
利用HipSTR从二代测序数据中精准解析短串联重复序列(STR)的遗传多态性 本文详细介绍了如何利用HipSTR工具从二代测序(NGS)数据中精准解析短串联重复序列(STR)的遗传多态性。通过三步走策略,HipSTR能够高效识别STR区域、估算重复次数并判定基因型,适用于法医鉴定、疾病研究和细胞系鉴定等多个领域。文章还提供了实战操作指南和常见问题解决方案,帮助研究者充分利用NGS数据开展STR分析。 阅读详情

相关推荐

java对接海康实现页面实时播放和回放

前言:之前已经写过一篇关于视频的文章,因为觉得有很多优化的地方,也谢谢同行们加我微信跟我提了一些需求和意见,所以在过年的假期重新写了一个比较能扩张的版本。 上一个版本的连接:https://blog.youkuaiyun.com/weixin_45848110/article/details/119363602 与之前的版本不同之处: 1.不需要安装ffmpeg 2.不需要安装nginx 3.直接运行jar即可 4.之前是完全脱离海康sdk,回放的录像是保存到本地服务,现在是直接在海康硬盘录像机获取录像回放 5.实时播

weixin_45848110的博客 1万+

try、catch、finally 用法总结

try catch finally 使用 整体执行流程如下,有图看着更容易理解。 详细说明和代码 try-catch-finally中无return时   如果try块中出现异常则进入catch中,执行完catch中代码后进入finally,如果catch中出现异常仍然会执行finally代码块,finally块执行结束后抛出异常。try块中无异常时执行完try块直接执行finally。 以catch中抛出异常为例,代码如下: 执行结果如下: try-catch-finally中包含return时  

weixin_42168421的博客 3万+

从数据校准到论文呈现:fsQCA与NCA方法融合的完整实证研究指南

本文详细介绍了fsQCA(模糊集定性比较分析)与NCA(必要条件分析)方法融合的完整实证研究流程,从数据校准到论文呈现。通过软件操作技巧、R语言NCA包高效使用及论文写作规范,帮助研究者避免常见误区,提升研究质量与可靠性。特别适合需要进行组态分析的研究生和学者参考。

weixin_29215391的博客 420

try-catch-finally | 加上return语句时执行顺序

try:用来捕获异常catch:用于处理try中捕获的异常finally:无论是否捕获或处理异常,finally块中的代码都会被执行。try必须有finally可以无try后面必须+一个或者多个catch | try后面+0个或者1个finally总结:try后面必须跟catch 或者 finally 其中之一try后面可以有0个或者多个catch,只能有0个或者1个finally。若try后面没有catch,则必须有一个finally。

大龄烤红薯的博客 6669

ADS 使用教程(十八)Encrypting Designs using RFIP Encoder in ADS

在这一节,我们使用RFIP Encoder进行设计加密,这是一种保护知识产权和敏感设计数据的重要方法。RFIP Encoder提供了一种安全的方式来加密设计文件,确保只有授权人员能够访问和使用这些文件。

Dirge19的博客 1172

基于FPGA的示波器设计

ADC 、DAC、FPGA、LCD液晶、示波器

FDL_AQ的博客 1万+

try,catch,finally用法

例三:(可看完后面的break知识点,再来看这个例子) 如果try语句后面有finally,try中就算有break用来跳出语句块,也不管用 只要有finally,不管try和catch语句中执行什么,一定会进入finally语句。注意: catch 和 finally 语句都是可选的,但你在使用 try 语句时必须至少使用一个(也就是try必须搭配catch或者finally)。​ 如果try语句后面有finally,try中的return不会跳出函数,因为一定要进入finally语句。

我的博客简介 2016

Xilinx Vitis arm-xilinx-eabi-gcc.exe: error: *.c: Invalid argument

This problem may be a bugof version 2021.1 only. Unfortunately, I'm just currently using this version. After Build Project: Find where this Makefile is through "make: Leaving directory" information. For me, it is located atZynq_CPU_wrapper_hw_platfo...

Ayka的博客 6663

try/catch/finally

try/catch/finally使用要点 1、finally内的代码不管有无异常发生,都会执行。由于finally的这个特点,它一般用于释放资源,如数据库连接、文件流等。 2、try/catch/finally语法中,catch不是必需的,也就是可以只有try/finally,表示不捕获异常,异常自动向上传递,但finally中的代码在异常发生后也执行。 3、如果在try或者catch语句内有return语句,finally块中,改变try块中返回变量的值,如果该变量是基本类型,则finally块中改变变

MpenggegeM的博客 483

报错:subprocess.CalledProcessError: Command ‘[‘where‘, ‘cl‘]‘ returned non-zero exit status 1.

右键此电脑--属性--高级系统设置--环境变量--系统变量--找到Path。Enterprise是企业版,如果你是社区版就找Community。2.安装的时候,c++桌面那个需要勾选。

2301_77554343的博客 1507

LoRa无线通信技术介绍(六)SX127X芯片收发程序讲解

接收LORA芯片SX127X的收发程序。

DT程序员的博客 1752

72. try-catch-finally结构

Java异常处理机制:try-catch-finally结构详解 try-catch-finally是Java处理异常的核心语法,由三部分组成: try块:包含可能抛出异常的代码 catch块:捕获并处理特定类型异常,可多级嵌套 finally块:无论是否发生异常都会执行,用于资源清理 与throws的区别: throws声明方法可能抛出的异常,交给调用者处理 try-catch在当前方法内直接处理异常 关键特性: 异常处理顺序:try→catch→finally

weixin_43484713的博客 579

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

try-catch-finally的执行顺序

try-catch-finally的执行顺序 结论: 不管有没有出现异常,finally代码块都会执行; 不管try和catch的代码块中有return时,finally仍会执行,且如果finally代码块也有return,则此代码肯定会返回finally执行的return值。 分有return和没有return来讨论try-catch-finally执行顺序的情况: 1 无return 举个例子: try { t(); tt(); } catch (Exception e) {

qq_43842093的博客 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

try-catch-finally return 的执行顺序

异常处理中,try、catch、finally是按顺序执行的。 即,如果try中没有异常,则顺序为try→finally, 如果try中有异常,则顺序为try→catch→finally。 但是当try、catch、finally中加入return之后,就会有几种不同的情况出现,下面分别来说明一下。也可以跳到最后直接看总结。 一、try中带有return private int testReturn1() { int i = 1; try { i++;

weixin_45122172的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

try{}、catch{}、finally{} 中 return 的执行顺序

try、catch、finally中的return 今天在做一个多线程加读写锁的测试时,考虑效率问题,想及时return结果,但存在一个严肃的问题,那就是锁的开启和关闭问题。因为锁开启后,用完不及时关闭,会因堵塞而造成资源无法请求。因此,做了一个测试,尽量做到全面,哪怕有些显得有些脑残,测试嘛。 /** * @author qing * * Try……catch……fin

脚步不停,信念不息! 2万+

try/catch-finally的执行顺序

题记 try-catch后只要有finally,那么finally就一定会被执行;不管try-catch是否有return,finally仍然会执行,如果finally中有return,则只会返回finally中的return的值。 try/catch-finally的执行顺序可以分为:有return和没有return来讨论 一、无return 1.如果没有捕捉到异常,执行try代码块,而不会执行catch的代码块,最后执行finally代码块。其执行顺序:try-->fin...

HandCream123的博客 6155

Java在异常处理中try、catch、finally的执行顺序

通过学习Java的异常处理,知道它是通过try-catch-finally来实现的,那么就有一个疑问?他们的执行顺序是如何的,接下来我将tong'g

qq_48241564的博客 6110

try catch finally 里面有return的执行顺序详细讲解

try catch finally 里面有return的执行顺序 实例测试 第一种情况 try里面有return,catch和finally里面吗没有return public static int tryTest(int i){ try { System.out.println("try里面的语句执行了!"); return i; }catch (Exception e){ e.printStack

qq_46589658的博客 5407

Java中try,catch,finally执行顺序

Java中try,catch,finally代码执行顺序是怎么样的?如果带有return又是怎样的?这是面试常考的一个问题。 先给出结论: 1.如果try中没有异常,则顺序为try→finally;如果try中有异常,顺序为try→catch→finally,并且异常之后的代码不会执行。 2.当try或catch中带有return时,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息。 还要注意,如果return的

Humphrey0313 4666

Java 的 try catch finally 执行顺序

Java 的 try catch finally 执行顺序

26857259 2364

try、catch、finally、return执行顺序超详解析与throw与throws区别

【代码】try、catch、finally、return执行顺序超详解析与throw与throws区别。

CHEN_DA_PING的博客 2612

try、catch、finally的执行顺序

1. 不带return的执行顺序 异常处理中,try、catch、finally的执行顺序: 如果try中没有异常,执行顺序为:try->finally 如果try中有异常,执行顺序为:try->catch->finally public class Test { public static int rank; public static void main(String[] args) { rank = 1; solve2(); System.ou

xingyu19911016的博客 1万+

Java的try/catch/finally中使用return详解

finally是无论如何都要执行的,除非在try/catch的语句块中使用的System.exit() 为了弄清楚Java中try/catch/finally中使用return语句的跳转,使用下面示例: 1. 首先在try中使用return,finally中不使用return public class App { public static void main(String[] args) throws Exception { App app = new App();

学而不思则忘 2547

java中的try catch finally return的执行顺序问题总结

在java中我们经常会遇到关于捕获异常的处理,下面总结了所有的关于try  catch finally return的执行顺序的问题的例子。 1.在finally后面不跟ruturn语句 1.1  在这种形式下try{  return; }catch{}finally{},如果try中没有异常就执行finally中的语句,如果有异常就执行catch和finally中的语句    有异常:

12的博客 4656

try{}catch{}finally{}中加入return后的执行顺序

在网上看到一些关于在try{}catch{}finally{}中加入return后的执行顺序的讨论,不衷一是,于是自己写了个例子测试,过程和结论如下。    在try{}catch{}finally{}程序中,无论是否发生异常且无论try或catch语句块中包含什么代码("System.exit();"除外),finally语句块中的代码都会被执行。但当try语句块中包含ret

Day day up! 2744

try,catch,finally执行顺序

1、正常执行顺序:try → catch → finally → 其他代码 2、try,catch和finally和其他代码的执行条件: 先执行try。 只要try中有异常,catch就会执行; finally总会执行; 其他代码: 如果finally中没有return:其他代码会执行; 如果finally中有return:其他代码不会执行; 注意:finally中的语句会在return之前执行,...

weixin_45100050的博客 1680
上一篇: 善用Eclipse的代码模板(Templates)功能
下一篇: Kafka官方文档中文版
iPaperMan
博客等级 码龄12年 2粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值