我对使用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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里Throwing有一个名为(guess what :))throw()的方法,它被声明为抛出一个MyException exception,并且有一个名为flag的公共字段,其中包含一个初始化为0的int,以提供一种条件检查.
因此,无论try块中发生什么,都会执行几次保护区域外的代码.
所以我的问题是,最后一块是什么?我的意思是,我知道当调用方法从try或catch块返回时它会派上用场(在这种情况下我可以在catch中有一个break语句并且finally会被执行),但在这种情况下,这是什么区别??
当try块退出时,finally块总是执行.这确保即使发生意外异常也会执行finally块.但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码.将清理代码放在finally块中始终是一种很好的做法,即使没有预期的例外情况也是如此.
请参阅:https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
| 归档时间: |
|
| 查看次数: |
560 次 |
| 最近记录: |