首页 > 试题广场 >

执行下列代码的输出是?

[单选题]
执行下列代码的输出结果是( )
public class Demo{
 public static void main(String args[]){
   int num = 10;
   System.out.println(test(num));
}
public static int test(int b){
   try
   {
    b += 10;
    return b;
   }
   catch(RuntimeException e)
   {
   }
   catch(Exception e2)
   {
   }
   finally
   {
    b += 10;
    return b;
   }
  }
}
  • 10
  • 20
  • 30
  • 40

如果finally块中有return语句的话,它将覆盖掉函数中其他return语句。

发表于 2016-06-08 22:37:53 回复(18)
如果finally块中有return语句的话,它将覆盖掉函数中其他return语句。
发表于 2021-01-12 21:29:55 回复(0)
B
发表于 2016-09-25 01:36:44 回复(0)
在java中,finally一定会被执行,所以结果为30
发表于 2016-05-15 18:16:33 回复(0)
推荐博文try-catch-finally执行顺序详解:http://qing0991.blog.51cto.com/1640542/1387200

try块中抛出异常,try、catch和finally中都有return语句

public static int WithException(){

int i=10;

try{

System.out.println("i in try block is "+i);

i = i/0;

return --i;

}

catch(Exception e){

System.out.println("i in catch - form try block is "+i);

--i;

System.out.println("i in catch block is "+i);

return --i;

}

finally{

System.out.println("i in finally - from try or catch block is--"+i);

--i;

System.out.println("i in finally block is--"+i);

return --i;

}

}

执行结果:

============WithException==================

i in try block is 10

i in catch - form try block is 10

i in catch block is 9

i in finally - from try or catch block is--8

i in finally block is--7

6

===============================

执行顺序:

抛出异常后,执行catch块,在catch块的return的--i执行完后,并不直接返回而是执行finally,因finally中有return语句,所以,执行,返回结果6。

结论:

try块中抛出异常,try、catch和finally中都有return语句,返回值是finally中的return。

总体结论:

结论一:

return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)
结论二:

finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。可行的做法有四:
(1)return语句只在函数最后出现一次
(2)return语句仅在try和catch里面都出现。
(3)return语句仅在try和函数的最后都出现。
(4)return语句仅在catch和函数的最后都出现。

注意,除此之外的其他做法都是不可行的,编译器会报错


我的Github ^_^ (欢迎follow): https://github.com/CircleZ3791117
编辑于 2018-02-09 15:43:11 回复(9)
关于try catch 知识:程序运行到 try块,b=20;并没有发生异常,不运行catch块,运行到return b;因为finally块无论如何都要运行,因此并不发生返回动作,进行运行finally块,b=30;
进行程序返回输出;
编辑于 2016-04-10 23:51:49 回复(11)
http://blog.csdn.net/wangshihui512/article/details/51674148

  1. finally代码块的语句在return之前一定会得到执行
  2. 如果try块中有return语句,finally代码块没有return语句,那么try块中的return语句在返回之前会先将要返回的值保存,之后执行finally代码块,最后将保存的返回值返回,finally代码块虽然对返回值进行修改也不影响返回值,因为要返回的值在执行finally代码块之前已经保存了,最终返回的是保存的旧值。
  3. 如果try块和finally块都有返回语句,那么虽然try块中返回值在执行finally代码块之前被保存了,但是最终执行的是finally代码块的return语句,try块中的return语句不再执行。
  4. catch块和try块类似,会在执行finally代码块执行前保存返回值的结果,finally语句中有return语句则执行finally的return语句,没有则执行catch块中的return语句,返回之前的保存值。
发表于 2016-06-14 19:39:41 回复(3)
finally不论如何都要执行
发表于 2016-04-07 08:47:43 回复(3)

如果finally块中有return语句的话,他将覆盖掉函数中其他return语句。

编辑于 2021-03-11 18:57:09 回复(0)
return在一个方法内只有一个,后面就不执行了,另外retrun是在finally后面执行的
所以是原始值作为值传递int i=10;   i +10;后面return准备执行时 还有一个finally      所以执行 i+10 后     再折回第一个return输出结果!
编辑于 2017-01-13 14:44:17 回复(0)
给个例子:
class Test {

    public int aaa() {

        int x = 1;

        try {

            return ++x;

        } catch (Exception e) {

        } finally {

            ++x;

        }

        return x;

    }

    public static void main(String[] args) {

        Test t = new Test();

        int y = t.aaa();

        System.out.println(y);

    }

}


答案是2不是3。


    已有知识:return 是可以当作终止语句来用的,我们经常用它来跳出当前方法,并返回一个值给调用方法。然后该方法就结束了,不会执行return下面的语句。

    finally :无论try语句发生了什么,无论抛出异常还是正常执行。finally语句都会执行。

Java官方教程说法:

    当try语句退出时肯定会执行finally语句。这确保了即使发了一个意想不到的异常也会执行finally语句块。但是finally的用处不仅是用来处理异常——它可以让程序员不会因为return、continue、或者break语句而忽略了清理代码。把清理代码放在finally语句块里是一个很好的做法,即便可能不会有异常发生也要这样做。


    注意,当try或者catch的代码在运行的时候,JVM退出了。那么finally语句块就不会执行。同样,如果线程在运行try或者catch的代码时被中断了或者被杀死了(killed),那么finally语句可能也不会执行了,即使整个运用还会继续执行。


    从上面的官方说明,我们知道无论try里执行了return语句、break语句、还是continue语句,finally语句块还会继续执行。如果在try语句里有return语句,finally语句还是会执行。它会在把控制权转移到该方法的调用者或者构造器前执行finally语句。也就是说,使用return语句把控制权转移给其他的方法前会执行finally语句。


    上面的程序执行完finally语句才执行 return。为什么?从上面的图可以合理推理出return +xx;是分开来执行的,先执行++x,再执行finally,最后才执行return跳出函数。


验证为什么是2不是3?


JVM官方规范:

如果try语句里有return,那么代码的行为如下:

    1.如果有返回值,就把返回值保存到局部变量中

    2.执行jsr指令跳到finally语句里执行

    3.执行完finally语句后,返回之前保存在局部变量表里的值


参考地址:https://blog.csdn.net/stduent_/article/details/60955365


如果finally块中有return语句的话,它将覆盖掉函数中其他return语句。

发表于 2018-08-16 23:01:56 回复(0)
选C

这个题考的是fianlly中有return,会覆盖try中的return。但是这个题比较重要的一点是finally块中对形参的变化。
也就是说,如果finally中没有return,而却对try中返回的数据进行了修改。这个修改遵循值/引用传递。
如果把finally中的return删除,那么这个题返回的是20,而不是30。就是因为值传递的问题(int是基本数据类型)。
发表于 2018-07-01 13:09:01 回复(1)
当try中有return语句时,会将这个将要return的变量从本地变量表推送到操作数栈顶,并不会马上退出方法体,然后继续执行finally中的语句,如果finally中也有 return语句,则会把finally中要return的变量推送到操作数栈顶,并返回这个栈顶元素.所以说不管try中是否有return,finally中的语句是一定会执行的.
发表于 2018-04-06 10:05:03 回复(0)
try块,b=20;并没有发生异常,不运行catch块,运行到return b;因为finally块无论如何都要运行,因此并不发生返回动作,进行运行finally块,b=30;
发表于 2021-11-04 16:05:21 回复(0)
1.无论什么情况finally代码块的内容总会被执行。2.如果try中有return,finally中也有return,此时先将try中return值入栈,在执行完finally中语句后将finally中的return值返回。3.如果try中有return,finally中没有return,此时在执行完try中的return后,将return值入栈保存,继续执行finally中的内容,最后将try中return的值出栈返回。
发表于 2021-10-26 23:57:49 回复(0)
如果finally里面有return,则数据跟随finally改变。如果没有return,则原数据不跟随finally里改变的数据改变!
发表于 2021-09-11 16:12:18 回复(0)
try中的return执行在finally之后,然后这道题就先执行了finally中的return,这样就返回的30
发表于 2016-04-09 15:02:59 回复(1)
finally里面语句任何情况都会执行的
finally的return语句会覆盖其他地方的return语句
发表于 2021-02-05 09:40:26 回复(0)
这个题要注意的地方我觉得就是,finally是无论如何都会允许的一段,记住这个这道题就能做对了。
发表于 2018-03-14 15:17:46 回复(0)
finally 语句块是在 try 或者 catch 中的 return 语句之前执行的
发表于 2017-07-28 16:58:36 回复(0)