用finally清除违例2007-05-28 yycnet.yeah.net yyc译无论一个违例是否在try块中发生,我们经常都想执行一些特定的代码。对一些特定的操作,经常都会遇到这种情况,但在恢复内存时一般都不需要(因为垃圾收集器会自动照料一切)。为达到这个目的,可在所有违例控制器的末尾使用一个finally从句(注释④)。所以完整的违例控制小节象下面这个样子:
try {
// 要保卫的区域:
// 可能“掷”出A,B,或C的危险情况
} catch (A a1) {
// 控制器 A
} catch (B b1) {
// 控制器 B
} catch (C c1) {
// 控制器 C
} finally {
// 每次都会发生的情况
}
④:C++违例控制未提供finally从句,因为它依赖构建器来达到这种清除效果。
为演示finally从句,请试验下面这个程序:
//: FinallyWorks.java// The finally clause is always executedpublic class FinallyWorks {static int count = 0;public static void main(String[] args) {while(true) {try {// post-increment is zero first time:if(count++ == 0)throw new Exception();System.out.println("No exception");} catch(Exception e) {System.out.println("Exception thrown");} finally {System.out.println("in finally clause");if(count == 2) break; // out of "while"}}}} ///:~
通过该程序,我们亦可知道如何应付Java违例(类似C++的违例)不允许我们恢复至违例产生地方的这一事实。若将自己的try块置入一个循环内,就可建立一个条件,它必须在继续程序之前满足。亦可添加一个static计数器或者另一些设备,允许循环在放弃以前尝试数种不同的方法。这样一来,我们的程序可以变得更加“健壮”。
输出如下:
Exception thrownin finally clauseNo exceptionin finally clause
无论是否“掷”出一个违例,finally从句都会执行。