2. try-catch-finally語句
try-catch語句還可以包括第三部分,就是finally子句。它表示無論是否出現(xiàn)異常,都應(yīng)當執(zhí)行的內(nèi)容。try-catch-finally語句的一般語法形式為:
try {
// 可能會發(fā)生異常的程序代碼
} catch (Type1 id1) {
// 捕獲并處理try拋出的異常類型Type1
} catch (Type2 id2) {
// 捕獲并處理try拋出的異常類型Type2
} finally {
// 無論是否發(fā)生異常,都將執(zhí)行的語句塊
}
例5 帶finally子句的異常處理程序。
public class TestException {
public static void main(String args[]) {
int i = 0;
String greetings[] = { " Hello world !", " Hello World !! ",
" HELLO WORLD !!!" };
while (i < 4) {
try {
// 特別注意循環(huán)控制變量i的設(shè)計,避免造成無限循環(huán)
System.out.println(greetings[i++]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("數(shù)組下標越界異常");
} finally {
System.out.println("--------------------------");
}
}
}
}
運行結(jié)果:
Hello world !
Hello World !!
HELLO WORLD !!!
數(shù)組下標越界異常
在例5中,請?zhí)貏e注意try子句中語句塊的設(shè)計,如果設(shè)計為如下,將會出現(xiàn)死循環(huán)。如果設(shè)計為:
try {
System.out.println (greetings[i]); i++;
}
小結(jié):
try 塊:用于捕獲異常。其后可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊。
catch 塊:用于處理try捕獲到的異常。
finally 塊:無論是否捕獲或處理異常,finally塊里的語句都會被執(zhí)行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執(zhí)行。在以下4種特殊情況下,finally塊不會被執(zhí)行: 1)在finally語句塊中發(fā)生了異常。 2)在前面的代碼中用了System.exit()退出程序。 3)程序所在的線程死亡。 4)關(guān)閉CPU。
3. try-catch-finally 規(guī)則
- 必須在 try 之后添加 catch 或 finally 塊。try 塊后可同時接 catch 和 finally 塊,但至少有一個塊。 2) 必須遵循塊順序:若代碼同時使用 catch 和 finally 塊,則必須將 catch 塊放在 try 塊之后。 3) catch 塊與相應(yīng)的異常類的類型相關(guān)。 4) 一個 try 塊可能有多個 catch 塊。若如此,則執(zhí)行第一個匹配塊。即Java虛擬機會把實際拋出的異常對象依次和各個catch代碼塊聲明的異常類型匹配,如果異常對象為某個異常類型或其子類的實例,就執(zhí)行這個catch代碼塊,不會再執(zhí)行其他的 catch代碼塊 5) 可嵌套 try-catch-finally 結(jié)構(gòu)。 6) 在 try-catch-finally 結(jié)構(gòu)中,可重新拋出異常。 7) 除了下列情況,總將執(zhí)行 finally 做為結(jié)束:JVM 過早終止(調(diào)用 System.exit(int));在 finally 塊中拋出一個未處理的異常;計算機斷電、失火、或遭遇病毒攻擊。
4. try、catch、finally語句塊的執(zhí)行順序:
1)當try沒有捕獲到異常時:try語句塊中的語句逐一被執(zhí)行,程序?qū)⑻^catch語句塊,執(zhí)行finally語句塊和其后的語句;
2)當try捕獲到異常,catch語句塊里沒有處理此異常的情況:當try語句塊里的某條語句出現(xiàn)異常時,而沒有處理此異常的catch語句塊時,此異常將會拋給JVM處理,finally語句塊里的語句還是會被執(zhí)行,但finally語句塊后的語句不會被執(zhí)行;
3)當try捕獲到異常,catch語句塊里有處理此異常的情況:在try語句塊中是按照順序來執(zhí)行的,當執(zhí)行到某一條語句出現(xiàn)異常時,程序?qū)⑻絚atch語句塊,并與catch語句塊逐一匹配,找到與之對應(yīng)的處理程序,其他的catch語句塊將不會被執(zhí)行,而try語句塊中,出現(xiàn)異常之后的語句也不會被執(zhí)行,catch語句塊執(zhí)行完后,執(zhí)行finally語句塊里的語句,最后執(zhí)行finally語句塊后的語句;
圖示try、catch、finally語句塊的執(zhí)行:

圖2 圖示try、catch、finally語句塊的執(zhí)行