除非在try塊或者catch塊中調(diào)用了退出虛擬機的方法(即System.exit(1);),否則不管在try塊沙郭、catch塊中執(zhí)行怎樣的代碼佛呻,出現(xiàn)怎樣的情況,異常處理的finally塊總是會被執(zhí)行的病线。不過吓著,一般情況下,不要再finally塊中使用return或throw等導(dǎo)致方法終止的語句送挑,因為一旦使用绑莺,將會導(dǎo)致try塊、catch塊中的return惕耕、throw語句失效纺裁。
總結(jié)一下這個小問題:
當程序執(zhí)行try塊,catch塊時遇到return語句或者throw語句司澎,這兩個語句都會導(dǎo)致該方法立即結(jié)束欺缘,所以系統(tǒng)并不會立即執(zhí)行這兩個語句,而是 去尋找該異常處理流程中的finally塊挤安,如果沒有finally塊谚殊,程序立即執(zhí)行return語句或者throw語句,方法終止蛤铜。如果有 finally塊嫩絮,系統(tǒng)立即開始執(zhí)行finally塊,只有當finally塊執(zhí)行完成后昂羡,系統(tǒng)才會再次跳回來執(zhí)行try塊絮记、catch塊里的 return或throw語句,如果finally塊里也使用了return或throw等導(dǎo)致方法終止的語句虐先,則finally塊已經(jīng)終止了方法怨愤,不用 再跳回去執(zhí)行try塊、catch塊里的任何代碼了蛹批。
綜上:盡量避免在finally塊里使用return或throw等導(dǎo)致方法終止的語句撰洗,否則可能出現(xiàn)一些很奇怪的情況篮愉!
使用throws拋出異常的思路是:當前方法不知道如何處理這種類型的異常,該異常應(yīng)該由上一級調(diào)用者處理差导,如果main方法也不知道應(yīng)該如何處理這種類型的異常试躏,也可以使用使用throws聲明拋出異常,該異常將交給JVM來處理设褐。
JVM對異常的處理方法:打印異常跟蹤棧的信息颠蕴,并終止程序運行,所以有很多程序遇到異常后自動結(jié)束
舉例說明:
publicclassTest{
publicstaticinttestFinally(){
try{
return1;
}catch(Exception?e)?{
return0;
}finally{
System.out.println("execute?finally");
}
}
publicstaticvoidmain(String[]?args){
intresult?=?testFinally();
System.out.println(result);
}
}
執(zhí)行結(jié)果:
execute finally
1