try-catch-finally语句块后面紧跟着return语句

27
我知道 try、catch 和 finally 语句的作用(大部分),但我有一个疑问:当我们在 try 或 catch 中已经有一个返回语句时,在 try-catch-finally 语句执行完后,如果还有一个返回语句,会发生什么?
例如:
public boolean someMethod(){
    boolean finished = false;
    try{
        // do something
        return true;
    }
    catch(someException e){
        // do something
    }
    finally{
        // do something
    }
    return finished;
}

假设尝试中没有出现错误,因此我们返回true。然后我们将执行finally中的操作,比如关闭一个连接,然后呢?

在finally中执行一些操作后(try中方法返回true),该方法会停止吗?还是会再次执行finally后继续执行,最终返回finished(为false)?

提前感谢您的回复。


11
为什么你不能直接执行代码然后看它返回了什么值? - Rohit Jain
7
因为他在公交车上,只是好奇而已。 - Joffrey
5个回答

27

finally块被执行并不意味着程序会忘记你已经返回了。如果一切顺利,在finally块后面的代码将不会被执行。

以下示例可以更好地说明这一点:

public class Main {

    public static void main(String[] args) {
        System.out.println("Normal: " + testNormal());
        System.out.println("Exception: " + testException());
    }

    public static int testNormal() {
        try {
            // no exception
            return 0;
        } catch (Exception e) {
            System.out.println("[normal] Exception caught");
        } finally {
            System.out.println("[normal] Finally");
        }
        System.out.println("[normal] Rest of code");
        return -1;
    }

    public static int testException() {
        try {
            throw new Exception();
        } catch (Exception e) {
            System.out.println("[except] Exception caught");
        } finally {
            System.out.println("[except] Finally");
        }
        System.out.println("[except] Rest of code");
        return -1;
    }

}

输出:

[normal] Finally
Normal: 0
[except] Exception caught
[except] Finally
[except] Rest of code
Exception: -1

10
如果一切顺利,会在执行finally块后执行try内的返回语句。
如果try内出现问题,exception将被捕获并执行,然后执行finally块,然后执行其后的返回语句。

@JqueryLearner 你为什么认为它是无法达到的? - Fildor
3
@JqueryLearner finally块不代表结束。试一下吧。它之后的所有代码都将完全可达。finally不返回任何东西,它只是一个代码块,在执行时无论是否发生异常都会被执行。 - Fildor
@JqueryLearner,不过是出于另一个原因。在finally中删除return,并在try块中放置实际上可能会抛出异常的内容。它将编译并运行。 - Fildor
1
@JqueryLearner 因为你在 finally 块中放置了一个 return,这使得 finally 块后面的所有内容都无法到达。 - Fildor
@Fildor 这是我的错,我以为 OP 在 finally 块中也有 return 语句。所以所有这些讨论都没有意义。抱歉。 - SpringLearner

3

“那种情况” 意味着 “没有异常”,而 “另一个返回” 是在 finally 块之后的那个,对吗?(只是为了澄清) - Fildor
我知道这个。我只是觉得你使用的措辞有些含糊不清... - Fildor
@Fildor 是的,我只涵盖了没有异常的情况,因为我认为这是最有趣的。这是在Java 7之前使用finally关闭资源的默认方式。 - Christophe Roussy
@Fildor return语句的位置是一个争论不休的话题;这主要取决于你工作场所的口味、约定和编码标准。 - Mark Rotteveel
@Fildor 如果变量在try之前已被初始化,那么这个方法可以生效,如果没有初始化,则必须使用双重返回语法。 - Christophe Roussy
显示剩余3条评论

2
public int Demo1()
    {
        try{
            System.out.println("TRY");
            throw new Exception();
            }catch(Exception e){
                System.out.println("CATCH");
            }finally{
                System.out.println("FINALLY");
            }return 0;

    }

调用此方法的输出如下:
TRY
CATCH
FINALLY
0

意味着在这种情况下,将Try{}catch{}finally{}作为一系列逐个执行的语句来考虑。然后控制权转移到返回。

0

确实,try块内的代码将被执行...但是当执行到return语句时...它将直接跳转至finally块而不执行try块中的return语句...然后finally块的代码将被执行,最后再执行try块中的return语句。


@Narendra11744 不行。如果你不知道结果,请尝试一些代码,但请不要提供错误的答案。如果没有发生异常,在finally块之后,try中的返回语句将被执行,没有其他内容。 - Joffrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接