异常处理中在finally里面写return会怎么样

本文详细探讨了Java中finally块内使用return语句的行为及其影响,并通过具体示例阐述了finally块中return语句的执行时机及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java里面异常模块中finally是肯定会执行的,那么,如果在finally语句块中写了return语句了,会怎么样呢?下面就来试试~~

异常处理中在finally里面写return会怎么样

程序方法

首先第一句的@SuppressWarnings("finally")是一个批注,该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默。其实就是在finally里面加return语句的话,编译器会发出警告,说"最后块不正常完成",所以强迫症看着有些不习惯,就用批注把警告弄掉了。下面看下代码,在传值进来后,对值进行判断,如果值小于0了,我们就抛一个数据格式错误的异常出去,同时在catch里面再抛出去。如果大于0,那么久return出去,然后看下finally里面,return一个-1出去;

那么,我们测试的时候传两个值进去,一个是-1一个是100,运行看下结果:

异常处理中在finally里面写return会怎么样

测试结果

可以看到不管是-1(-1只是测试数据和finally返回的-1不是同一个概念,换成-2也是输出的-1)还是100,输出都是-1 。那么这是为什么呢,为什么100的时候return出去却无效了呢?还有一二问题,明明在doIt()方法里抛出了异常,在main里面try,catch了,为什么捕捉不到异常呢?

先解答第一个:

因为finally里面写了return语句的时候,就会覆盖掉try代码块里面的return。因为finally是肯定会执行的,所以,当传进-1时,捕捉到异常后直接抛出异常,之后执行到finally代码块,finally中把返回值给重置了,所以,返回的是-1的值。同理100的情况跟这个也差不多,我们用Debug运行查看时,可以看到如果不满足小于0的条件时,直接就跳到了finally块去执行return了。这是为什么我们在finally中写return后程序会给我们警告,警告的内容也就是上面所说的“最后块不正常完成”。那么,问题又来了,可以在finally里面去修改变量的值,然后再return出去呢?

异常处理中在finally里面写return会怎么样

修改变量的方法

那么,大家猜猜这个代码返回的会是什么呢?

该方法的返回值永远都是2.而不会是-1或者0,那为什么不会执行到finally后面的“return 0”呢,因为在finally执行完毕之后该方法就已经有返回值了,后续代码就不会再执行了(大家也可以用Debug调试试一下),然后后面的修改值无效是因为前面return的时候,已经确定了return出去的是int类型,那么由于基本类型都是值的拷贝,所以finally后面再修改a的值已经没有意义了,所以返回的永远都是2.

接着解释第二个:为什么把异常throw出去了,在mian里面却捕捉不到,因为异常线程在监视到有异常发生的时候,就会登记当前的异常类型为DataFormatException,但是当执行器执行finally代码块的时候,重新为doIt方法赋值了,也就是告诉了线程这个这个方法没有异常,所以就相当于把异常给屏蔽了,这样在mian里面也就无法捕捉到异常了。

所以讲这么多,其实是为了告诉大家,千万不要在finally语句里面处理返回值什么的,因为一写下去,会产生一些很隐蔽的错误,写代码的时候要切忌~~~~

好了今天就到这边了~谢谢观看,喜欢的关注一波~~持续更新中~

附上今天的十个单词:

search 搜索

file 文件

exists 存在

isFile 是文件

isDirectory 是目录

getName 获取名字

getPath 获取路径

InputStream 输入流

OutputStream 输出流

Unicode 字符编码标准

//一位网友的总结:

结论:

1、不管有木有出现异常,finally块中代码都会执行;

2、当try和catch中有return时,finally仍然会执行;

3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;

4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

举例:

情况1:try{} catch(){}finally{} return;             显然程序按顺序执行。

情况2:try{ return; }catch(){} finally{} return;           程序执行try块中return之前(包括return语句中的表达式运算)代码;          再执行finally块,最后执行try中return;          finally块之后的语句return,因为程序在try中已经return所以不再执行。

情况3:try{ } catch(){return;} finally{} return;          程序先执行try,如果遇到异常执行catch块,          有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,                      最后执行catch块中return. finally之后也就是4处的代码不再执行。          无异常:执行完try再finally再return.

情况4:try{ return; }catch(){} finally{return;}           程序执行try块中return之前(包括return语句中的表达式运算)代码;           再执行finally块,因为finally块中有return所以提前退出。

情况5:try{} catch(){return;}finally{return;}           程序执行catch块中return之前(包括return语句中的表达式运算)代码;           再执行finally块,因为finally块中有return所以提前退出。

情况6:try{ return;}catch(){return;} finally{return;}           程序执行try块中return之前(包括return语句中的表达式运算)代码;           有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;                        则再执行finally块,因为finally块中有return所以提前退出。           无异常:则再执行finally块,因为finally块中有return所以提前退出。

最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。                   如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,

<think>首先,用户的问题是:“我想了解在try块中有return语句时,finally块是否会执行请问try中包含return后是否还会执行finally块”。这是一个关于Java异常处理机制的问题。从系统级指令来看:-所有行内数学表达式使用$...$,但这个问题不涉及数学,所以可能不需要。-独立公式使用$$...$$,但同样不适用。-LaTeX语法正确:不适用。-使用中文回答:必须用中文。-生成相关问题:在回答末尾生成相关问题。-回答中引用的段落末尾添加引用标识:我有几个引用内容需要处理。用户提供的引用:-引用[^1]:在Java中,如果try和finally都有return,最终执行finallyreturnfinally总是执行。-引用[^2]:finally块会执行,但如果finallyreturn,它会覆盖try的return。-引用[^3]:finally块在try的return之前执行;如果finallyreturn,它覆盖try的。-引用[^4]:展示了代码示例,说明执行顺序。用户的问题核心是:try中有return时,finally是否执行。基于引用和我的知识:-在Java中,finally块总是执行,无论try块中是否有return、异常或正常退出。-如果try中有returnfinally块会在return语句实际返回前执行。-如果finally块中也有return语句,它会覆盖try块中的return值。所以,回答应该确认finally块会执行,并解释执行顺序。回答结构:1.直接回答问题:是的,finally块会执行。2.解释执行顺序。3.提供简单示例或说明。4.引用提供的引用内容来支持回答。5.在末尾添加引用标识。6.生成相关问题。生成相关问题:-基于主题,如:finally块的作用、常见陷阱、其他语言的行为等。最终回答大纲:-开头:明确回答用户问题。-主体:详细解释执行顺序和注意事项。-引用:自然融入引用。-结尾:生成相关问题。</think>是的,在Java中,当`try`块中包含`return`语句时,**`finally`块仍然会执行**。这是Java异常处理机制的核心特性之一,目的是确保资源清理或关键操作无论程序流程如何变化(如返回、异常或正常退出)都能可靠执行。下面我将逐步解释执行顺序和关键注意事项,帮助你清晰理解。 ### 1. **基本执行顺序** - 当`try`块中遇到`return`语句时,方法不会立即返回结果,而是**先暂停`return`操作**,转而执行`finally`块中的代码。 - 执行完`finally`块后,方法再根据`finally`块的内容决定最终返回值或行为。 - 简单流程: - 进入`try`块 → 执行到`return` → 暂停返回 → 执行`finally`块 → 完成`finally`后,再处理返回值。 例如,考虑以下代码: ```java public class Test { public static int testMethod() { try { System.out.println("进入try块"); return 1; // 这里return被暂停 } finally { System.out.println("进入finally块"); } } public static void main(String[] args) { System.out.println("返回值: " + testMethod()); } } ``` 输出结果为: ``` 进入try块 进入finally块 返回值: 1 ``` 这表明`finally`块在`return`之前执行了,但未影响返回值[^2]。 ### 2. **关键注意事项** - **`finally`块总是执行**:无论`try`块中是否有`return`、异常或正常结束,`finally`块都会运行。这包括以下场景: - `try`块正常执行到`return`。 - `try`块抛出异常后被`catch`捕获。 - `try`块直接抛出异常未被捕获(但`finally`仍执行)。 - **`finally`块中有`return`的情况**:如果`finally`块也包含`return`语句,它会覆盖`try`块中的返回值。因为`finally`的`return`会“抢占”执行权,导致`try`块的`return`被忽略。 - 示例: ```java public static int testMethod() { try { return 1; } finally { System.out.println("finally执行"); return 2; // 覆盖try的返回值 } } ``` 输出:`finally执行`,最终返回值为`2`,而不是`1`[^1][^3]。 - **`finally`块影响返回值**:如果`finally`块修改了变量但不包含`return`,则`try`块中已确定的返回值可能被改变(如果返回值基于变量)。例如: ```java public static int testMethod() { int value = 0; try { value = 1; return value; // 返回1(value的当前值被缓存) } finally { value = 2; // 修改value,但不影响已缓存的返回值 } } ``` 输出:返回`1`,因为`return`语句已缓存了`value`的值,`finally`的修改不影响它[^2]。 - **特殊情况**:如果`try`块中调用`System.exit(0)`,则程序立即终止,`finally`块不会执行[^4]。 ### 3. **为什么这样设计?** Java的这种机制保证了资源的可靠释放(如关闭文件、数据库连接),避免内存泄漏。即使在方法提前返回时,清理代码也能强制执行。但需注意,在`finally`中添加`return`可能导致调试困难,因为它会掩盖`try`块的逻辑,因此建议仅在必要时使用[^1][^3]。 ### 总结 - **是否执行`finally`?** 是的,`try`块中的`return`不会阻止`finally`块执行。 - **执行顺序**:`finally`在`try`的`return`之前运行。 - **最佳实践**:避免在`finally`中使用`return`,除非有特定需求,以免意外覆盖返回值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值