首页 > 试题广场 >

以下代码返回值是什么

[单选题]
public boolean returnTest()
{
    try
    {
        return true;
    }
    catch (Exception e)
    {

    }
    finally
    {
        return false;
    }
}
以上代码返回值是什么?
  • true
  • false
一旦在finally块中使用了return或throw语句,将会导致try块,catch块中的return,throw语句失效
摘自《疯狂Java 讲义》(第三版)P366
发表于 2017-02-24 21:19:50 回复(9)
参考这里 http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.5

我的理解:
1、首先执行到try里的return,但是有finally语句还要执行,于是先执行return后面的语句,例如(x++),把要返回的值保存到局部变量。
2、执行finally语句的内容,其中有return语句,这时就会忽略try中的return,直接返回。

测试代码:
public static int returnTestInt(){ int a = 0;  try { return a++;  } catch (Exception e) {

    } finally { return ++a;  }
}
上面的代码,在我的机器上返回结果是2.
于是本题就很简单了,选择false。
编辑于 2015-08-31 13:39:07 回复(8)
finally其实是仅在return 语句执行前执行,如果return 一个函数,那么会先执行函数,但如果函数内有(return)语句,那么finally就会在这个return 语句前执行。finally在catch中的return之前执行但是如果catch中有返回值而finally中也有返回值的话finally中的返回值会替换catch中的返回值,因为catch中的返回值是存放在一个临时区中。
如果catch块有异常向外抛出,执行顺序呢:我执行我的,你抛你得异常,我finally我的语句,我俩互不干涉,你别管我啥时执行,但我一定会执行。
关于finally,您只需记着一点:除非调用system.exit()让程序退出(也就是将调用这个程序的进程断开了、退出了这个程序)就不会执行或断电等因素致使程序停止进程终止,否则,无论任何因素,finally块都一定会执行。
发表于 2015-11-04 16:54:37 回复(9)
try说我要return true结束运行了,finally你有啥事没做的赶紧搞定哈,做完我好return。 finally说我这边也就return个false,结束运行。咦?好像你的return,没用上啊。我这边先结束运行了。。。
发表于 2017-03-22 11:39:57 回复(8)
返回值是false,因为finallyreturn true前执行,执行finally的时候就renturn false了。
编辑于 2018-09-24 11:15:34 回复(15)
复制粘贴的别人的微博:一旦finally中使用了return或throw语句,将会导致try块、catch块中的return、throw语句失效。 
当java程序执行try块、catch块时遇到了return或throw语句,这两个语句会导致方法立即结束,所以系统并不会立即执行者两个语句, 
而是去寻找是否有finally块,如果没有,程序立即执行return或throw语句,方法终止;如果有finally,系统立即执行finall 
块,只有当finally块执行完成后系统才跳回来执行try、Catch块里的return、throw,如果finally里也使用了return或 
throw等导致方法终止的语句,则finally块已经终止了方法,系统将不会跳回执行try、catch块里的任何代码
发表于 2017-08-02 09:51:44 回复(8)
try
   {
       System.out.println("我是try");;
   }
   catch (Exception e)
   {
 
   }
   finally
   {
       System.out.println("我是finally");
   }
实验结果:
我是try
我是finally
finally是必然执行的,而且在try执行之后,不要被那个return干扰了,各位牛友,要把握本质。

编辑于 2015-10-07 01:18:54 回复(6)
1. finally中的return一定会覆盖try/catch中的return。
2. finally块在return前执行
3. 一旦try中有return,但是finally对return的变量进行了修改,这个修改符合值/引用传递的规则。
发表于 2018-06-26 21:05:54 回复(1)
如果finally中有return 语句会覆盖try 和 catch 语句中的return 
注意:int i = 0 ;
        try{   return ++i;}
        catch(Exception e) {   return ++i; }
        fianlly( return ++i; }
i = 2;  虽然fianlly覆盖了try的return ,但 ++i执行了,只是还没有返回,这时候跳到finally,发现fianlly也需要return ,因此继续++i, i = 2; 
发表于 2022-04-30 12:17:30 回复(0)
finally的return语句会覆盖掉try中的return语句
发表于 2022-01-09 11:41:15 回复(0)
先执行try中的代码,然后执行finally中的代码,可是finally中的代码一定会被执行,所以最终返回的结果是false
发表于 2015-06-19 09:36:51 回复(0)
public static String test() {
	String a = "初始化";
	try {
		System.out.println("执行try块");
		return a = "try返回";
	} catch (Exception e) {
			
	}finally {
	    System.out.println(a);
		System.out.println("执行finally块");  
		return "finally返回";
	}
} public static void main(String[] args) {     System.out.println(test());     } 
上述代码执行结果如下:  
执行try块
try返回
执行finally块
finally返回

这里可以明显看到try块中的return其实是被执行过的,但是它不会返回,它还是要去执行finally中的内容,最后返回的才是返回的结果


发表于 2020-03-13 13:48:56 回复(1)
    在try中的return处打个断点,在finally中的return处打个断点。很明显,程序先走try中的return,再走finally的return。
    因此,遇到这种问题,返回的肯定是finally中的return.
    答案选B,false
发表于 2015-09-04 17:22:40 回复(0)
try- catch- finally语句中,不管异常发生与否,finally语句都会执行,finally语句中的return会覆盖前面的return
发表于 2022-04-05 21:30:29 回复(0)
finally无论如何都会执行,如果try和catch里面有结束语句,依然会先去检查finally。不知为啥,这题我我就一个选项:true,名符其实单项选择
发表于 2021-11-10 13:14:38 回复(0)
一旦在finally块中使用了return或throw语句,将会导致try块,catch块中的return,throw语句失效
发表于 2021-10-16 18:42:47 回复(0)
finally 中的 return 语句将覆盖 try 中的 return 语句;
发表于 2020-08-19 17:04:02 回复(0)

大家看这里:

package com.niuke.Test;

public class returnTestInt {
    public static int test(){
        int a = 0;
        try {
            return ++a;
        } catch (Exception e) {

    } finally {
            System.out.println("你好");
        }
        return ++a;
    }

    public static void main(String [] args){
        System.out.println(test());    
    }
}

运行结果:
你好
1

为什么会这样,那是因为如果try中有return,而finally中没有return,那么finally中的代码会在try中return执行前执行,所以会输出你好,然后再执行try中return,因此最后的return就不会执行了。

public class returnTestInt {
    public static int test(){
        int a = 0;
        try {
            return ++a;
        } catch (Exception e) {

    } finally {
            System.out.println("你好");
            return a++;
        }
    }

    public static void main(String [] args){
        System.out.println(test());    
    }
}

运行结果:
你好
1
假如finally中的代码在try中return执行前执行,那么输出结果应该是2对不对?但是这里答案却是1,因此就说明并不是在try中return执行前执行。应该是按照顺序执行,最后执行finally中的代码,那样结果才是2。可以将两个return中的代码交换,也就是这样:

public class returnTestInt {
    public static int test(){
        int a = 0;
        try {
            return a++;
        } catch (Exception e) {

    } finally {
            System.out.println("你好");
            return ++a;
        }
    }

    public static void main(String [] args){
        System.out.println(test());    
    }
}

运行结果:
你好
2

总结一下,不管你try中有没有return,finally中的代码一定会执行。当try中有return,但是finally中没有,则finally中的代码在try中return执行前执行;当两者中均有return,那么先执行finally中return之前的代码,然后执行try中return,最后执行finally中的return!!!

发表于 2019-04-21 17:41:20 回复(1)
异常处理时,finally先于其他部分加载,而return是程序结束跳转,所以finally中有return语句的话,不会执行try-catch语句,自然输出false了。我不懂其他人分析那么复杂是要干嘛。。。
编辑于 2018-10-27 11:21:04 回复(0)
首先对于这道题目,返回值是false,因为我们都知道,不论如何finally一定会执行。
然后我做了个小实验:


结果是这样的,(忽略左边的false),

可以看到,如果finally里面没有return ,是会先return回来,然后再去执行finally!****。
发表于 2017-08-22 14:14:22 回复(0)