1. 程式人生 > >一、異常

一、異常

不能 所在 但是 沒有 依次 線程 種類 print 系統


1、概念
程序在編譯運行的過程中遇到的種種不正常的現象
Java中所有的異常都是Throwable類的子類,Throwable類主要描述了各種不同的異常,因此,Java中的每個異常都是對象

2、分類
Throwable類:所有錯誤或者所有異常的父類,有兩個子類:
Error:大多數的錯誤與代碼編寫者無關,表示JVM層面的問題
Exception:程序能夠捕獲並且解決的問題
CheckedException:編譯時異常,程序在編譯時出現異常,這種異常必須處理,否則程序沒有執行的寄回
RuntimeException: 運行時異常,程序編譯可以通過,但是運行的過程中出現異常


3.處理異常的方法


在Java中,處理異常的機制:捕獲,拋出異常

1>捕獲異常
語法:
try{
//可能存在異常的代碼
}
catch(異常的種類){
//異常的信息
}
finally{

}

在try塊中遇到了異常,代碼將不會繼續向下執行,所以每次只能捕獲一個異常
一個try後面可以有多個catch塊
如果catch中的異常類型直接沒有繼承關系,則catch塊的順序沒有要求,但是有繼承關系,則子類必須在前,父類在後

finally塊寫在try-catch的最後,表示不管try中的代碼不會產生異常,或者某個catch會不會被執行。
finally塊都會被執行
執行順序:try-catch-finally

finally只要用於流中,用於關閉流,為了釋放與當前流有關的資源
特殊情況:如果在try或者catch中出席那了return語句,finally依舊會被執行
catch塊結束之後,方法執行之前 finally塊執行

特殊用法:在finally中嵌套try-catch-finally 主要用於流中

7、返回異常 獲取異常的原因
對象的錯誤跟蹤信息輸出到錯誤的輸出流

e.printStackTrace();
返回異常的錯誤信息
System.out.println(e.getMessage());

擴展:finally不會被執行的情況
a、在前面的代碼中出現了System.exit()退出程序
b、程序所在的線程死亡【stop()】
c、cpu關閉

擴展二:註意問題
a、如果一個程序中有多個異常,可以直接用一個catch,類型直接使員工Exception
b、try-catch-finally三個關鍵字都不能單獨使用
c、一個變量如果想要在try,catch或者finally中都能訪問到的話,只能定義在語句外

總結:
a、try中語句沒有異常:try中語句會依次執行,程序會直接跳過catch語句,執行finally中的語句
b、try中出現異常,但是異常沒有被處理【沒有匹配到對應的catch塊】,則這個異常最終給了JVM處理,finally塊中的代碼依舊會執行
c、try中出現了異常,並且匹配到了對應的catch塊,try-catch-finally

try-catch就是把異常屏蔽了沒有真正的解決


2>拋出異常
throw:拋出一個異常對象,調用這異常所在的方法的時候則會遇到異常
throws:定義在方法的聲明部分,用來表示一種可能性【當前方法有可能存在異常】
throw和throws並不是必須成對出現
如果拋出的是編譯時異常,throws必須要寫
如果拋出的是運行是異常,throws必須要寫

throws可以單獨使用

註意:
a、throws必須出現方法的聲明部分,throw出現在方法體
b、throws只表示一種可能性,並不一定發生異常,throw則是直接拋出異常,執行到了throw則一定拋出了某個異常對象
c、throws和throw都是一種消極的處理問題的方式,所以異常不會真正被處理的

3>自定義異常
當系統的異常不能解決某些問題,需要自定義異常
就是對於throw關鍵字的應用

實現方式:
繼承自Exception,是編譯時異常【運行時異常提前到編譯時】
繼承自RuntimeException,是運行時異常

一、異常