無論一個違例是否在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從句都會執行。