无论一个违例是否在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 executed public 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 thrown in finally clause No exception in finally clause
无论是否“掷”出一个违例,finally从句城市执行。