什么是第一 - 最后还是阻止?

Yuv*_*dam 23 java

考虑以下测试用例:

public class Main {

    static int a = 0;

    public static void main(String[] args) {
        try {
            test();
            System.out.println("---");
            test2();
        }
        catch(Exception e) {
            System.out.println(a + ": outer catch");
            a++;
        }
    }

    public static void test()
    {
        try {
            throw new Exception();
        }
        catch (Exception e) {
            System.out.println(a + ": inner catch");
            a++;
        }
        finally {
            System.out.println(a + ": finally");
            a++;
        }
    }

    public static void test2() throws Exception
    {
        try {
            throw new Exception();
        }
        finally {
            System.out.println(a + ": finally");
            a++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

随着输出:

0: inner catch
1: finally
---
2: finally
3: outer catch
Run Code Online (Sandbox Code Playgroud)

什么是解释为什么test()捕获发生在最后,而在test2()它的另一种方式?

pol*_*nts 17

关键点是:

  • 在一个try-(catch)-finally块中,最后执行finally该特定try块的操作
  • 您可以将块嵌套 try在另一个嵌套块中,并且每个嵌套try块都可以拥有自己的块,这些块finally将针对这些try块执行

所以是的,finally最后执行,但适用于try它附加的块.

所以给出以下代码段:

try {
    try {
        throw null;
    } finally {
        System.out.println("Finally (inner)");
    }
} catch (Throwable e) {
    System.out.println("Catch (outer)");
}
Run Code Online (Sandbox Code Playgroud)

打印(如ideone.com上所示):

Finally (inner)
Catch (outer)
Run Code Online (Sandbox Code Playgroud)

观察:

  • (inner),Finally是最后一个(无论是否catch成功)
  • Catch (outer)跟随Finally (inner),但那是因为Finally (inner)嵌套在另一个 try块内(outer)

同样,以下代码段:

    try {
        try {
            throw null;
        } catch (Throwable e) {
            System.out.println("Catch (inner)");
        } finally {
            System.out.println("Finally (inner)");
            throw null;
        }
    } catch (Throwable e) {
        System.out.println("Catch (outer)");
    }
Run Code Online (Sandbox Code Playgroud)

打印(如ideone.com上所示):

Catch (inner)
Finally (inner)
Catch (outer)
Run Code Online (Sandbox Code Playgroud)

参考

相关问题


Bal*_*usC 16

因为try块中test2()没有catch块,只有一个finally.代码不会"跳回"调用者进入catch,然后"跳到" finally继续前进,就像你想象的那样.


Pet*_*ans 7

catch最终出现在同一个try-catch-finally范围之前.

它test2在test2的try-catch-finally范围内没有捕获,所以它在离开范围之前完成了最终并落入了更高的catch.