考虑以下测试用例:
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)
catch最终出现在同一个try-catch-finally范围之前.
它test2在test2的try-catch-finally范围内没有捕获,所以它在离开范围之前完成了最终并落入了更高的catch.
| 归档时间: |
|
| 查看次数: |
18095 次 |
| 最近记录: |