我对Java相当陌生,无法理解try-catch-finally块中的控制流。每当在catch块中捕获异常时,无论是否将其放在finally块中,都将执行catch块后的代码。那么finally block有什么用呢?
class Excp
{
public static void main(String args[])
{
int a,b,c;
try
{
a=0;
b=10;
c=b/a;
System.out.println("This line will not be executed");
}
catch(ArithmeticException e)
{
System.out.println("Divided by zero");
}
System.out.println("After exception is handled");
}
}
如果我将最后一个print语句放在finally块中,则没有区别。
如果在try/catch
块中发生另一个异常(未由您的代码处理),则会产生差异。
如果没有finally
,最后一行将不会执行。对于finally
,无论发生什么都执行代码。
这在执行垃圾收集器无法执行的清理任务时特别有用:系统资源,数据库锁定,文件删除等。
考虑一下:
try {
a=0;
b=10;
c=b/a;
System.out.println("This line will not be executed");
}
catch(ArithmeticException e){
throw new RuntimeException("Stuff went wrong", e);
}
System.out.println("This line will also not be executed");
finally块可用于执行,即使在函数返回之后。
。
public boolean doSmth() {
try {
return true;
}
finally {
return false;
}
}
如果从catch
块抛出异常,或者从try
块抛出不同的异常,finally
块也将执行。
例子:
try {
int a=5;
int b=0;
int c=a/b;
catch (NullPointerException e) {
// won't reach here
} finally {
// will reach here
}
也可以完全省略catch块,但仍然保证finally块将被执行:
try {
int a=5;
int b=0;
int c=a/b;
} finally {
// will reach here
}
finally块中的代码总是执行,即使在try
或catch
中存在return
或未处理的异常。这里解释了这一点,这是通过一个非常简单的谷歌搜索找到的。