【发布时间】:2015-04-02 15:40:11
【问题描述】:
我对使用 try/catch/finally 子句有疑问,让我解释一下: 我知道在其声明中声明异常规范的每个方法都必须用 try 块包围(在调用方法中),然后是一个可以捕获该异常的 catch 块(除非我没有声明调用方法抛出一个例外)。如果调用方法在 try-catch 之后还有其他语句,则无论发生什么(是否抛出异常)都会执行这些语句。所以如果我有以下代码:
public class ExceptionCall {
Throwing t = new Throwing();
public void methodTry(){
while(true){
try {
if (t.flag++==0)
t.throwing();
System.out.println("no exception");
}
catch (MyException e) {
e.printStackTrace(System.err);
System.out.println("working on it!");
}
finally{
System.out.println("finally clause");
}
System.out.println("out");
if (t.flag==2)
break;
}
}
}
这里 Throwing 有一个名为 (猜猜看 :) ) throwing() 的方法,该方法被声明为抛出一个 MyException exception,并且有一个名为 flag 的公共字段,其中包含一个初始化为 0 的 int,以提供一种条件检查.
因此,无论在 try 块中发生什么,都会执行保护区域之外的代码。
所以我的问题是,finally 块是做什么用的?我的意思是,我知道当调用方法从 try 或 catch 块返回时它会派上用场(在这种情况下,我可以在 catch 内有一个 break 语句,并且 finally 将被执行),但在这种情况下,什么是区别??
【问题讨论】:
-
由于你的 catch 不会让你脱离你的循环甚至你的方法(没有
return、break,而不是重新抛出),所以这里真的不需要 finally。finally的一种用法可能是清理您在try中所做的事情,否则这些事情会泄漏或留给 GC。