首页 > 试题广场 >

下面程序的输出结果为( ) pub...

[单选题]
下面程序的结果是
public class Demo {
    public static String sRet = "";
    public static void func(int i)
    {
        try
        {
            if (i%2==0)
            {
                throw new Exception();
            }
        }
        catch (Exception e)
        {
            sRet += "0";
            return;
        } 
        finally
        {
            sRet += "1";
        }
        sRet += "2";
    }
    public static void main(String[] args)
    {
        func(1);
        func(2);
        System.out.println(sRet);
    }
}

  • 120
  • 1201
  • 12012
  • 101
第一步,func(1),if条件不成立,不抛出异常,catch不运行,final运行,拼串得到“1”,程序继续往下走,拼串得到“12”。 第二步,fun(2),if条件成立,抛出异常,catch捕获异常,运行catch里面代码,拼串得到“120”,虽然有return,但是不管出不出异常,final里代码必须执行,执行final,拼串得到“1201”,然后return结束。所以最终结果“1201”。 新手刚学,欢迎交流。
编辑于 2019-08-20 20:53:54 回复(15)
写出这种代码的人可以拿去人道毁灭了
发表于 2019-09-19 11:05:26 回复(15)
“1201”
①调用func(1),if不符合,直接进入finally,sRet=“1"
②finally语句中没有返回值,故继续向下执行,sRet="12"
③调用func(2),if符合,sRet="120",此时有返回值!!!
④调用finally语句,sRet="1201"
⑤因为已经有返回值了,finally之后的语句也不再执行,sRet="1201"。

菜狗解析,有错误指出嘻嘻
发表于 2019-09-03 18:31:51 回复(2)
执行func(2)时,抛出异常,执行catch中return之前的语句,然后执行finally中的语句,最后在执行return语句
编辑于 2019-06-16 16:49:52 回复(0)
总结一波
  1. 如果finally前面的代码中有return,那么先执行finally中的语句然后再执行return。
  2. 如果finally中的代码也有return,则finally中return的结果会覆盖前面代码中的return结果。
编辑于 2020-06-05 20:09:19 回复(1)
finally{}后面的语句,如果前面没有检测到有return语句就会被执行,留个言提醒自己
发表于 2019-08-18 18:39:54 回复(2)
代码没有格式化,看的脑袋都疼

发表于 2019-09-22 16:10:31 回复(1)
发表于 2020-08-02 11:37:27 回复(0)
<————此为在百度搜到的结果,若有错误望指正————>
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。
发表于 2020-06-10 11:13:34 回复(0)
return暂时挂起,执行finally后在拿下来执行
发表于 2019-08-10 11:36:01 回复(1)
<p>这道题目的关键是sRet变量是static的。如果不是static,catch代码块里执行了return前,finally里对变量的修改不会影响到最终的返回值</p>
发表于 2021-01-12 22:56:59 回复(0)
无论如何finally里的内容必须会被执行,
只有当System.exit(0);
时,finally不会再执行,它的意思是系统退出,jvm结束。
finally是在return语句执行之后,返回之前执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前就已经确定了;
finally中如果包含return,那么程序将在这里返回。
当有return时,return下面的代码除了finally之外都不会执行
发表于 2019-08-19 20:32:07 回复(0)
垃圾题目 缩进都给不好还出题?
发表于 2020-07-18 18:58:25 回复(0)
出这道题的人真是个小天才
发表于 2022-02-26 20:31:48 回复(0)
在catch捕获异常并最终指向finally语句时,其后面的不执行。
发表于 2022-04-29 12:17:55 回复(0)
前面执行return后的finally{...}后的代码不执行,所以第二轮的2不会输出
发表于 2022-03-20 18:53:43 回复(0)
第二次执行的时候 抛出了一个异常被cath语句捕获 输出cath语句里面的类容,然后在执行finally语句里面的 因为抛异常了 后面的代码不执行
发表于 2021-10-30 21:30:13 回复(0)
面试题:try块中的return先执行还是finally中代码先执行? 如果try和finally中各有return那么最终返回谁? 答:1 先执行finally 2 返回finally中的return值
发表于 2020-01-31 19:09:23 回复(0)
执行func(2),try里捕获到异常执行catch语句,执行到return语句后暂时将return挂起来,程序向后检查发现finally语句,将finally语句执行完毕后再返回来执行return。try...catch语句后的程序不再执行。
发表于 2022-05-03 17:05:17 回复(0)
先执行func(1),不满足if,但是必须执行finallysRet += "1";sRet += "2";再执行func(2),满足if 执行catchsRet += "0";不会立马return,还是要执行finallysRet += "1";再执行return,结束
发表于 2022-04-02 17:47:12 回复(0)