黑马程序员技术交流社区
标题: try {}里有一个return语句,那么紧跟在这个try后的finally {}里... [打印本页]
作者: hmwudizl91zl 时间: 2013-10-6 11:32
标题: try {}里有一个return语句,那么紧跟在这个try后的finally {}里...
本帖最后由 hmwudizl91zl 于 2013-10-6 17:36 编辑
在看到后面这段代码前的我的答案是在return之前,看完之后我发现,但往更细地说,答案是在return中间执行
下面就是这段代码:
public classTest {
/**
* @paramargs add by zxx ,Dec 9, 2008
*/
public static voidmain(String[] args) {
// TODO Auto-generated method stub
System.out.println(newTest().test());;
}
static int test() {
int x = 1;
try{
returnx;
}
finally {
++x;
}
}
}
---------执行结果 ---------1
运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。
作者: 黑马戴帅军 时间: 2013-10-6 13:11
本帖最后由 黑马戴帅军 于 2013-10-6 13:16 编辑
finally代码块中是一定会被执行的代码。
但是你的finally代码块中只对x进行了+1的运算,但是并没有对x的值进行返回或打印。如果finally中写了return的方法,那么输出的就是2.不写return的话就是1.但是try中的return方法从代码开始执行,就确定下来了。- class Test {
-
- public static void main(String[] args) {
- System.out.println(new Test().test());;
- }
- static int test() {
- int x = 1;
- try{
- return x;
- }
- finally {
- ++x;
- return x;//此处返回x的值。
- }
- }
- }
复制代码 try中的return是在finally代码块之后执行的。从下面的代码可以看出。- class Test {
-
- public static void main(String[] args) {
- System.out.println(new Test().test());;
- }
- static int test() {
- int x = 1;
- try{
- return x;
- }
- finally {
- ++x;
- System.out.println(x);//对x的值进行打印。输出结果是2和1
- //由此可以看出,finally代码块是在try之前的代码执行的。
- }
- }
- }
复制代码 希望可以帮到你。
作者: 麦子 时间: 2013-10-6 15:03
finally是一定会执行的,只有代码中有system.exit() 这种情况 才不会执行finally,因为该句终止了虚拟机进程
finally会在return之前执行,应为在return执行后,该函数就结束了,而finally又是一定要执行的代码域,所以应该是在之前执行
如果在finally里面有return情况会更复杂
作者: 乔兵 时间: 2013-10-6 16:15
问题解决后,请修改帖子分类为:提问结束
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |