最后尝试接球,然后再回球



我知道如何尝试,捕获&终于工作了(在大多数情况下(,但我有一件事想知道:当我们在try(或catch(中已经有return时,try-catch之后的return语句会发生什么?

例如:

public boolean someMethod(){
    boolean finished = false;
    try{
        // do something
        return true;
    }
    catch(someException e){
        // do something
    }
    finally{
        // do something
    }
    return finished;
}

假设尝试中没有出现任何错误,那么我们返回了true。然后我们将进入最后一步,在那里我们可以做一些事情,比如关闭连接,然后呢?

在我们在finally中做了一些事情后,该方法会停止吗(因此该方法在try中返回true(,还是在finally之后该方法会再次继续,导致返回finished(这是false(?

提前感谢您的回复。

执行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

如果一切顺利,则在执行finally块之后执行try内部的返回。

如果try内部出现问题,则捕获并执行exception,然后执行finally块,然后执行之后的返回。

在这种情况下,finally中的代码会运行,但当没有异常时,会跳过另一个返回。你也可以通过记录一些东西来亲眼看到这一点:(

另请参阅有关System.exit的内容:Java';s System.exit((是否使用try/catch/finaly块?

终于看到了回归:从Java 中的finally块返回

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{}视为一个接一个执行的语句序列。然后控制权又回来了。

try中的代码肯定会执行。。但是当它到达return语句时。。它将移动到finally块,而不执行try块中的return语句。。然后finally的代码将被执行,然后try的返回语句将被执行。

相关内容

  • 没有找到相关文章

最新更新