首页 > 试题广场 >

public int testException() {

[单选题]
public int testException() { 
    int i = 0; 
    try {
        i++; 
        throw new Exception("error");
    } catch (Exception e) {  
        return i++;
    } finally {
        i++;
    }
}
以上方法被调用后,返回值是多少
  • 1
  • 2
  • 3
  • 程序抛异常
说一下我的理解:
catch块中的:return i++
相当于:return i ;   i++; 两步。
但是在执行return i;之后,不会真正的return,即只是会将结果 i 保存在一个临时栈中,接着执行finally中的语句,最后才会从临时栈中取出之前的结果返回。同理,finally中的语句不会影响到返回的 i 的值,因为要返回的值已经存到临时栈,不会再被更改了。
以上是我对该题的理解,欢迎大家批评指正!
如果将代码改成:
public int testException() {   int i = 0;   try {   i++;   throw new Exception("error");   } catch (Exception e) {   return ++i;  //将原来的 i++ 改成了 ++i    } finally {  i++;    } 
}
最终输出结果是 i = 2
分享一个总结的比较清楚的博客:https://blog.csdn.net/ns_code/article/details/17485221
编辑于 2019-02-17 11:20:00 回复(1)
对于含有return语句的情况,这里我们可以简单地总结如下:

    try语句在返回前,将其他所有的操作执行完,保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况:

    情况一:如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。

    情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。

    情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况,:

        1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。

        2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
发表于 2021-07-17 11:13:48 回复(0)
答案是1

return i++; //返回是i的值1,因为i是基本类型所以后面finally修改也不起作用
发表于 2023-03-25 11:22:13 回复(0)