首页 > 试题广场 >

下面函数将返回?

[单选题]
下面函数将返回?
public static int func (){
    try{
        return 1;
    }catch (Exception e){
        return 2;
    }finally{
        return 3;
    }
}
  • 1
  • 2
  • 3
  • 编译错误
finally一定会执行的,有两种情况:
    1.finally中有return语句,当try执行到return时会执行finally中的代码,其中有return 就直接返回了,如题,返回值为3.
    
    2.finally中不含return语句,那么当执行到return时,它会被保存等待finally执行完毕后返回,这个时候无论finally内部如何改变这个值,都不会影响返回结果!如:
int i = 0 ;
	int test(){
		try {
			return i;
		} catch (Exception e) {
			return -1;
		}finally{
			i++;
		}
	}
//input: 0

发表于 2016-08-01 16:48:40 回复(7)
记住:无论如何finally语句都要执行就会这个题了
finally语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句不能影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。(同学们可以踊跃探讨哦)
编辑于 2015-09-19 12:02:27 回复(21)
Try catch finally获取异常错误的结构,try中有两种情况: 1.try中没有异常时,但是有return等跳转语句,这样会引发程序控制流离开当前的try,自动完成finally中资源的释放。 2try中有异常时,catch在获取到异常之前,进行finally执行,接着执行catch中的语句。 由于本题中的finally中有return语句,将try中的return语句覆盖,程序直接跳出。
发表于 2015-10-06 21:12:36 回复(4)
异常处理中的finally必须在函数退出前执行
发表于 2015-09-16 08:11:37 回复(0)
Finally代码块的内容是一定要执行到的,如果try代码块和catch代码块中都有return语句,那么在执行到其中的return语句之后返回return之前,如果finally代码块中没有return语句,则返回的值就是try代码块或catch代码块中的return的值。如果finally代码中有return语句,就会覆盖try代码块和catch代码块中的return语句。
发表于 2015-12-06 16:43:58 回复(1)
执行到return1的时候,函数不会直接退出,return1被存放在栈空间,因为finally里的代码块必须被执行,执行完return1后,没有发生异常所以不会执行return2,执行return3程序直接返回,并不会再去栈空间里找return1了。
可以看这篇博客:http://blog.csdn.net/world6/article/details/52027585
发表于 2016-08-27 23:43:03 回复(4)
如果finally中没有return ,正常是将return的值先保存,执行finally后返回return的值。
但是finally中有return,就会先执行finally中的return。
发表于 2015-11-23 16:26:35 回复(1)
唉头像
看到第五行return2...果断选了编译错误

现在过来看..题目被改回来了
编辑于 2015-09-18 12:07:10 回复(2)
首先执行try段中的代码,当try中有return时,将该值保存
如果没有异常则执行finally段代码
1.无return 则执行完finally所有代码之后执行try的return
2.有return 删除try返回值的保存,返回finally的return
发表于 2018-07-30 10:17:20 回复(0)
只要记住
在try或者catch中有return的话,就把return之前的值保存在一个temp临时变量中,最后返回是临时变量
finally中的return会拦截try或者catch中的return,也就是优先返回,使try块的return失效
static int test() {
	int i = 0;
	try {
		i += 1;// 1
		return i;// 被finally拦截
	} catch (Exception e) {
		return -1;
	} finally {
		i += 2;// 3
		return i;// 3
	}
}
输出结果为:3 try块的return被拦截
static int test() {
	int i = 0;
	try {
		i += 1;// i=1
		return i;// 将返回之前的值放入temp=1,执行完finally后,返回temp值(此时i=3,temp=1)
	} catch (Exception e) {
		return -1;
	} finally {
		i += 2;// i=3
	}
}
输出结果:1 return返回的是一个临时储存的变量temp而不是i了
发表于 2017-08-10 11:44:21 回复(1)
选C     无论如何finally语句都要执行,所以就是3
发表于 2016-01-08 09:30:30 回复(1)
在Java异常处理中,finally块的作用是就是为了保证无论出现什么情况,finally块里的代码一定会被执行。由于程序执行return就意味着结束对当前函数的调用并跳出这个函数体,因此任何语句要执行都只能在return语句前执行(除非碰到exit()函数),因此finally块里的代码也是在return之前执行的。此外,如果try-finally或者catch-finally中都有return,那么finally块中的return语句会覆盖别处的return语句,最终返回到调用者那里的是finally中return的值
发表于 2018-04-18 11:07:40 回复(0)
如果try中有强制退出(System.exit()),finally里的语句就不会执行
发表于 2017-09-15 18:50:39 回复(0)
无论异常是否发生finally块都将执行,及时使用了return语句,除非catch块中调用了System.exit()方法
发表于 2016-03-09 16:47:18 回复(0)
try finally中都有return语句时,程序执行到try的return时,会先执行finally,然后finally中有return,直接就return了!
发表于 2015-10-10 13:35:38 回复(0)
finally是最后返回结果前一定执行的
发表于 2020-04-16 08:56:41 回复(0)
finally的执行顺序在return语句之前,return的值是存放在临时栈中的,当其前面的语句执行完了之后就取出临时栈的值返回,但是此处的finally将临时栈中的值已经修改了
发表于 2019-10-29 10:03:47 回复(0)
以为try执行完就退出了。
发表于 2019-08-12 11:06:39 回复(0)
1.finally代码块一定会执行 2.如果之前有return,则将结果保存,执行完finally代码块内容后再回到return 的地方,去执行return 3.如果finally中有return,那就直接走了,不管之前的return了。 需要注意的是:这种做法在实际开发中肯定是要被同事和经理吊起来打的
发表于 2019-05-28 17:12:09 回复(0)
finally中有return语句,当try执行到return时会执行finally中的代码,其中有return 就直接返回了
发表于 2019-05-02 10:05:57 回复(0)