首页 > 试题广场 >

有关finally语句块说法正确的是( )

[不定项选择题]
有关finally语句块说法正确的是( )
  • 不管catch是否捕获异常,finally语句块都是要被执行的
  • 在try语句块或catch语句块中执行到System.exit(0)直接退出程序
  • finally块中的return语句会覆盖try块中的return返回
  • finally 语句块在 catch语句块中的return语句之前执行

结论:
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的,
编译器把finally中的return实现为一个warning。

发表于 2017-06-04 21:33:39 回复(35)

D.不是return之前,是return执行完成之前,return表达式的结果会暂时保存起来,不会被改变

编辑于 2019-03-11 16:58:07 回复(11)
答案C:
根据官方的JVM规范:

如果try语句里有return,那么代码的行为如下:
1.如果有返回值,就把返回值保存到局部变量中
2.执行jsr指令跳到finally语句里执行
3.执行完finally语句后,返回之前保存在局部变量表里的值

如果try,finally语句里均有return,忽略try的return,而使用finally的return.

编辑于 2017-07-07 09:00:29 回复(12)
A:选项存在疑问,一般情况下不管try{}catch(){}语句块如何结束,finally保证其所包含的语句块最终被执行,但是存在特殊情况:1.try语句没有被执行到,如在try语句之前就返回了;2.在try块中有System.exit(0)),此时finally中的语句块是不会执行的;
B:System.exit(0)。表示将整个虚拟机里的内容都释放,JVM停止工作,此时程序正常退出;
C和D: finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,但是不建议在finally中return。
编辑于 2017-05-24 10:18:45 回复(14)
D选项是错误的,finally在catch的return之后执行

发表于 2018-09-10 16:46:01 回复(12)
就没人觉得A B 是矛盾的嘛
发表于 2017-07-17 09:41:40 回复(4)
D.不是return之前,是finally在return执行完成之前去执行,return表达式的结果会暂时保存起来,不会被改变。其实是执行了一半
发表于 2019-03-19 23:52:47 回复(2)
根据官方的JVM规范:

如果try语句里有return,那么代码的行为如下: 
1.如果有返回值,就把返回值保存到局部变量中
2.执行jsr指令跳到finally语句里执行
3.执行完finally语句后,返回之前保存在局部变量表里的值

如果try,finally语句里均有return,忽略try的return,而使用finally的return,所以D错误.

发表于 2019-02-18 15:48:27 回复(0)
单看A是没问题的 你问我finally执不执行 那我肯定是执行的
但是看到B  B也是对的 那么A和B是不是矛盾了呢?  不是的. A中隐含了一个前提 就是不出这些幺蛾子的情况下.
比如你在执行try的时候把电源拔了或者电脑砸了 那finally肯定也不执行
发表于 2018-07-02 15:34:07 回复(2)
finally是在try、catch中的return语句后面的表达式 运算后 执行的(此时 并没有返回 运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;

所以d选项也对。
编辑于 2017-11-23 18:00:06 回复(0)
1. system.exit(0)是终止jvm的,所以调用该方法时,finally不会被执行到。 2. finally是在try的return语句执行后执行,在return返回值之前执行。 3. finally中的return会覆盖try的return语句
发表于 2019-09-02 12:31:49 回复(0)

D: catch语句的return 的执行结果 先暂存,待 finally执行完后,再返回 return的值。(finally此时没return。)

try/catch 代码块内含有return,同时finally也有return值时,直接返回finally的return。

发表于 2022-05-17 10:58:57 回复(0)
我觉得答案错了,D选项不应该是对的吗
发表于 2019-08-15 10:10:20 回复(2)

这个B万万没想到系列啊

发表于 2018-08-09 16:37:23 回复(0)
AB选项明显矛盾,如果在try代码块中有system.exit(0),finally代码不会执行,程序直接退出了,单元测试直接变灰了
发表于 2017-07-23 12:24:37 回复(2)
很多牛友肯定D选项有疑问,重点不是return之前,是return执行完成之前,return表达式的结果会暂时保存起来,不会被改变
发表于 2023-04-22 23:32:00 回复(0)
D选项: int i = 0; catch {     return ++i;   }  
 finally {   system.out.println(i)   }
输出结果为1,因为++i已经执行,i = 0 -->  i = 1 
return 语句还没返回结果之前,但语句被执行,如果finally中也有return 会把catch或者try中的语句覆盖
发表于 2022-04-30 10:38:10 回复(0)
D catch 中的return 执行了,但不返回结果,先去执行finally 再回来返回结果
发表于 2022-04-14 17:11:26 回复(0)
属实整笑了
发表于 2022-03-07 20:52:41 回复(2)
  1. 无论异常是否被捕获,finally的代码一定会被执行。
  2. finally里适合存放释放资源、后续处理的代码。
发表于 2022-03-06 11:08:44 回复(0)