1 JAVA異常
異常:阻止方法或方法域繼續(xù)執(zhí)行的問題剥啤。指不期而來的各種狀況芝雪,如:文件找不到减余、內(nèi)存越界等。異常是一個事件惩系,發(fā)生在程序運行期間位岔,干擾程序的正常執(zhí)行如筛。而JAVA異常Throwable類下又分為若干子類,分別處理不同狀況下所遇到的異常赃承。下圖是java異常層次圖
Throwable:是所有異常類的祖先類妙黍。Throwable
下有兩個重要的子類Error(錯誤)
和Exception(異常)
悴侵。
Error(錯誤):是程序無法處理的錯誤瞧剖,主要發(fā)生在程序運行過程中,錯誤的發(fā)生與代碼編寫者的操縱無關可免,是JVM運行時所出現(xiàn)的問題抓于。例如:JVM運行時出錯發(fā)生VirtualMachineError
,從而導致內(nèi)存資源不足浇借,將出現(xiàn)OutOfMemoryError
異常捉撮,最終JVM將終止線程。
Exception(異常):是程序可以處理的異常妇垢。Exception
下有一個重要的子類RuntimeException
巾遭。RuntimeException
主要是JVM操作所引起的異常。例如:數(shù)組越界(ArrayIndexOutOfBoundException)
闯估、空指針異常NullPointException
等灼舍。
** * 異常和錯誤的區(qū)別:異常能被程序所處理,而錯誤是不能被處理的涨薪。***
Exception主要分為編譯性異常和運行時異常骑素。
編譯性異常:是除了
RuntimenException
之外的其它的Exception
類和其子類。編譯性異常必須需要被處理刚夺,不被處理代碼將不會被編譯通過献丑。例如:IOException
、SQLException
或者是用戶自定的異常等侠姑。運行時異常:是
RuntimeException
類或其子類创橄。例如:NullPointException
、IndexOutOfBoundException
等莽红。對于運行時異常妥畏, 程序中可以選擇性處理,可以選擇處理也可以不處理船老,運行時異常主要是代碼邏輯所引發(fā)的異常咖熟。
2 處理異常機制
在java應用程序中,異常處理機制主要分為:拋出異常 和 捕捉異常
拋出異常:當應用程序發(fā)生錯誤引發(fā)異常時柳畔,方法將創(chuàng)建異常對象提交給運行時系統(tǒng)馍管,異常對象主要包含異常類型和當前程序的狀態(tài)等異常信息,而運行時系統(tǒng)將會尋找合適的方法去處理所提交的異常薪韩。
捕獲異常:當引用程序發(fā)生異常時确沸,運行時系統(tǒng)將會去尋找合適的異常處理器捌锭。潛在的異常處理器是異常發(fā)生時依次存儲在調(diào)用棧中的一個集合中。當異常處理器的異常類型和拋出的異常的類型相同時罗捎,即找到了對應的異常處理器去處理異常观谦。若沒有找到合適的異常處理器去處理異常,程序?qū)K止運行桨菜。
- 捕獲異常:try-catch-finally
try{
//可能會發(fā)生異常的程序代碼
}catch(Type1id1){
//捕獲并處理try拋出的異常類型Type1
}catch(Type2id2){
//捕獲并處理try拋出的異常類型Type2
}finally{
//無論是否發(fā)生異常豁状,都將執(zhí)行的語句塊
}
try塊:用于捕獲異常,其后可以寫零或多個catch
塊倒得,若沒有catch
塊時泻红,其后必須要寫一個finally
塊。
catch塊:用于處理捕獲的異常霞掺。
finally塊:無論程序是否遇到異常谊路,finally
塊都將被執(zhí)行。* 若在finally
塊之前有return
語句菩彬,那么finally
塊代碼將會在return
返回前執(zhí)行 *缠劝。當發(fā)生一下幾種情況時finally
塊將不會被執(zhí)行。
1. 在finally
塊中出現(xiàn)異常骗灶。
2. 在前面的代碼中使用了System.exit(int)
退出了程序惨恭。
3. 程序所在的線程死亡。
4. CPU關閉矿卑。
- 拋出異常
任何java代碼都可以拋出異常喉恋。但是方法中都必須使用throws
拋出。
如果一個方法可能會出現(xiàn)異常母廷,而這個方法卻沒有能力去處理轻黑,那么就需要使用throws
來將異常拋出。例如自行車出現(xiàn)故障琴昆,自行車無法處理氓鄙,那么就讓騎車的任處理。throws
語句在定義方法時聲明該方法要拋出的異常類型业舍,如果拋出的時Exception
類型抖拦,則該方法被聲明拋出所有類型的異常。當拋出多個類型異常時舷暮,中間用”态罪,“分割。
void methodName throws Exceptio1,Exception2.....(){
}
使用throws
將會把異常拋給調(diào)用方法的調(diào)用者下面, 當然調(diào)用者還可以繼續(xù)往上拋出复颈,但最后必須要有可以處理異常的調(diào)用者。
- Throwable類中常見的方法
- e.getCause():返回拋出的原因沥割,如果cause不存在耗啦,返回null凿菩。
- e.getMessage():返回異常的信息。
- printStackTrace():錯誤的輸出流帜讲。
3 自定義異常類
java內(nèi)置的異常類有的時候不能滿足用戶所有的需求衅谷,這時用戶就需要自定義異常類了,只需要繼承Exception
類似将。
class MyException extends Exception{
public MyException(String messagr){
super(message)
}
}