異常主要包括下面三種類型
"檢查性異常"描述了正確程序中所發(fā)生的問題,這些問題一般情況下是因為外在環(huán)境的條件不滿足而引起的,如用戶錯誤及I/O問題.例如,程序試圖打開一個并不存在的遠(yuǎn)程Socket端口.這種錯誤不能歸結(jié)到程序本身邏輯的錯誤,而很有可能是遠(yuǎn)程機(jī)器名字 錯誤(用戶拼寫錯誤)引起的.如果這個遠(yuǎn)程機(jī)器名是用戶輸入提供的,這種錯誤不可避免,對于一個商業(yè)型的軟件系統(tǒng),程序的開發(fā)者必須處理這個問題并恢復(fù)系統(tǒng).Java編譯器強(qiáng)制要求你處理這類異常,如果沒有捕捉這類異常,程序?qū)⒉荒鼙痪幾g.
"運(yùn)行期異常"通常意味著程序存在Bug,如數(shù)組越界,被0除,入?yún)⒉粷M足規(guī)范等這類問題導(dǎo)致運(yùn)行期的異常.這類異常一般需要通過更改程序來避免.所以Java編譯器比強(qiáng)制要求開發(fā)人員處理這類異常.
"錯誤"一般情況下是非常少見的,也很難通過程序來解決它.它可能源于一個程序Bug,但一般情況下更可能來源于環(huán)境的問題,如內(nèi)存耗盡等問題."錯誤"在程序中無須處理它,而又運(yùn)行環(huán)境處理.
在使用finally時,在以下特殊情況,finally塊不會被執(zhí)行:
在finally塊中發(fā)生了異常
程序所在的線程死亡.
在前面的代碼中用System.exit()退出運(yùn)行.
關(guān)閉CPU.
對于多個異常的捕捉處理
處理規(guī)則:子類異常的處理塊必須在父類異常的處理塊之前,否則會發(fā)生編譯錯誤.如
try
{
}
catch(GrandchildException e1)
{
...
}
catch(ChildException e2)
{
.....
}
catch(ParentExceotion e3)
{
....
}
巧妙利用異常
當(dāng)方法體中的代碼發(fā)生異常時,可以不予處理直接將異常"踢"給調(diào)用者.此外,也可通過語句產(chǎn)生一個異常.
自己編寫的的程序也可以向外拋出異常,首先實(shí)例化一個異常對象,然后用throw關(guān)鍵字將這個異常拋出去.考試,大提示合在一起如throw new IOException("文件不存在");
將這兩步合起來的好處是:在創(chuàng)建異常時會包含其創(chuàng)建處的行信息,異常被捕捉時可以通過Stack Trace的形式報告這些信息.如果在同一行代碼創(chuàng)建和拋出異常,對于程序的調(diào)試將非常有用
"檢查性異常"描述了正確程序中所發(fā)生的問題,這些問題一般情況下是因為外在環(huán)境的條件不滿足而引起的,如用戶錯誤及I/O問題.例如,程序試圖打開一個并不存在的遠(yuǎn)程Socket端口.這種錯誤不能歸結(jié)到程序本身邏輯的錯誤,而很有可能是遠(yuǎn)程機(jī)器名字 錯誤(用戶拼寫錯誤)引起的.如果這個遠(yuǎn)程機(jī)器名是用戶輸入提供的,這種錯誤不可避免,對于一個商業(yè)型的軟件系統(tǒng),程序的開發(fā)者必須處理這個問題并恢復(fù)系統(tǒng).Java編譯器強(qiáng)制要求你處理這類異常,如果沒有捕捉這類異常,程序?qū)⒉荒鼙痪幾g.
"運(yùn)行期異常"通常意味著程序存在Bug,如數(shù)組越界,被0除,入?yún)⒉粷M足規(guī)范等這類問題導(dǎo)致運(yùn)行期的異常.這類異常一般需要通過更改程序來避免.所以Java編譯器比強(qiáng)制要求開發(fā)人員處理這類異常.
"錯誤"一般情況下是非常少見的,也很難通過程序來解決它.它可能源于一個程序Bug,但一般情況下更可能來源于環(huán)境的問題,如內(nèi)存耗盡等問題."錯誤"在程序中無須處理它,而又運(yùn)行環(huán)境處理.
在使用finally時,在以下特殊情況,finally塊不會被執(zhí)行:
在finally塊中發(fā)生了異常
程序所在的線程死亡.
在前面的代碼中用System.exit()退出運(yùn)行.
關(guān)閉CPU.
對于多個異常的捕捉處理
處理規(guī)則:子類異常的處理塊必須在父類異常的處理塊之前,否則會發(fā)生編譯錯誤.如
try
{
}
catch(GrandchildException e1)
{
...
}
catch(ChildException e2)
{
.....
}
catch(ParentExceotion e3)
{
....
}
巧妙利用異常
當(dāng)方法體中的代碼發(fā)生異常時,可以不予處理直接將異常"踢"給調(diào)用者.此外,也可通過語句產(chǎn)生一個異常.
自己編寫的的程序也可以向外拋出異常,首先實(shí)例化一個異常對象,然后用throw關(guān)鍵字將這個異常拋出去.考試,大提示合在一起如throw new IOException("文件不存在");
將這兩步合起來的好處是:在創(chuàng)建異常時會包含其創(chuàng)建處的行信息,異常被捕捉時可以通過Stack Trace的形式報告這些信息.如果在同一行代碼創(chuàng)建和拋出異常,對于程序的調(diào)試將非常有用