異常Throwable

異常(Throwable).png
概念:
Throwable 類(lèi)是 Java 語(yǔ)言中所有錯(cuò)誤或異常的超類(lèi)。只有當(dāng)對(duì)象是此類(lèi)(或其子類(lèi)之一)的實(shí)例時(shí),才能通過(guò) Java 虛擬機(jī)或者 Java 語(yǔ)句拋出。類(lèi)似地,只有此類(lèi)或其子類(lèi)之一才可以是 子句中的參數(shù)類(lèi)型。
特點(diǎn):
Throwable是一個(gè)實(shí)體類(lèi):可以從他的構(gòu)造方法和方法來(lái)以及他的子類(lèi)看他的特性和屬性。
Error
概述:
Error 是 的子類(lèi),用于指示合理的應(yīng)用程序不應(yīng)該試圖捕獲的嚴(yán)重問(wèn)題。大多數(shù)這樣的錯(cuò)誤都是異常條件。雖然 錯(cuò)誤是一個(gè)“正規(guī)”的條件,但它也是 的子類(lèi),因?yàn)榇蠖鄶?shù)應(yīng)用程序都不應(yīng)該試圖捕獲它。
特點(diǎn):
錯(cuò)誤是無(wú)法處理的,必須改源碼,就相當(dāng)于某個(gè)機(jī)器的零件缺少或者是壞道了必須更換才能讓機(jī)器正常運(yùn)行。
Exception
概念:
Exception 類(lèi)及其子類(lèi)是 Throwable 的一種形式,它指出了合理的應(yīng)用程序想要捕獲的條件。
特點(diǎn):
- 編譯期異常:程序在編譯器就報(bào)出的異常,這里需要我們先解決這個(gè)異常才能運(yùn)行程序
- 運(yùn)行期異常:編譯器不會(huì)報(bào)的異常,而是程序在執(zhí)行到某段代碼時(shí)才會(huì)報(bào)出的異常。
用法:
-
throw關(guān)鍵字
- 在指定的方法內(nèi)部拋出指定的異常
- 格式:throw new xxException("產(chǎn)生異常的原因");
- throw方法后面new的必須是Exception類(lèi)對(duì)象或者Exception類(lèi)的子類(lèi)對(duì)象
- 當(dāng)throw拋出這個(gè)異常的時(shí)候我們就要對(duì)其進(jìn)行處理不然JVM會(huì)終止程序的運(yùn)行的
- 當(dāng)new的對(duì)象是RuntimeException或者RuntimeException的子類(lèi)對(duì)象時(shí)我們可以不進(jìn)行處理默認(rèn)交給JVM處理(打印異常對(duì)象,終止程序運(yùn)行)
- 當(dāng)new的對(duì)象時(shí)編譯器異常時(shí),我們就要對(duì)其進(jìn)行處理了。
- throws拋給調(diào)用者
- try ......catch捕獲處理
public class Demo_Throw {
public static void main(String[] args) {
int [] array = null;
int [] arr=new int[3];
int index=0;
int index1=4;
// getElement(array,index);
getElement1(arr,index1);
}
private static void getElement1(int[] arr, int index1) {
if (index1<0||index1>arr.length){
throw new IndexOutOfBoundsException("index索引越界");
}
}
private static void getElement(int[] array, int index) {
if (array==null){
throw new NullPointerException("數(shù)組為空");
}else {
int value=array[index];
}
}
}
-
throws關(guān)鍵字
- throws:處理異常的一種方式,寫(xiě)在方法名后面。
- 作用:將異常交給方法的調(diào)用者處理,如果他的調(diào)用者也不處理最后將會(huì)由JVM進(jìn)行處理(打印異常類(lèi),終止程序)
- 格式:修飾符 返回類(lèi)型 方法名稱(chēng)(參數(shù)列表)throws XXXException,YYYException....{}
- 注意:當(dāng)throws后面接的異常對(duì)象有多個(gè)時(shí),必須都要寫(xiě)上,如果這多個(gè)對(duì)象有子父類(lèi)關(guān)系時(shí),可以只寫(xiě)父類(lèi)
public class Demo_Throws {
public static void main(String[] args) throws IOException {
demo("C;\\a.txta");
}
private static void demo(String fileName) throws IOException {
if(!fileName.endsWith(".txt")){
throw new IOException("file type error" );
}else {
System.out.println("file read OK");
}
}
}
-
try....catch...finally捕獲異常進(jìn)行處理
異常的第二種處理方式,當(dāng)throw拋出異常時(shí),我們用它進(jìn)行捕獲然后處理,這樣不影響程序的后續(xù)執(zhí)行,即不會(huì)終止程序,這也是開(kāi)發(fā)中最推薦使用的一種方式。
-
格式:
try{ 可能出現(xiàn)異常的代碼塊 }catch(異常類(lèi)名 變量名){ //這里可以使用自定義的異常類(lèi),但是自定義的異常類(lèi)必須繼承Exception才能使用 這里對(duì)異常進(jìn)行處理,一般時(shí)存入錯(cuò)誤日志 }finally{ 強(qiáng)制要執(zhí)行的(無(wú)論程序是否出現(xiàn)異常都要執(zhí)行的) } //這里的finally不是一定需要的,finally一般用來(lái)釋放某種資源占用,它不能單獨(dú)存在,必須依托try catch存在 使用案例:
public class Demo_TryCatchFinally {
public static void main(String[] args){
try {
demo("C;\\a.txta");
}catch (IOException e){
e.printStackTrace();//打印詳細(xì)異常信息
}finally {
//釋放IO資源
System.out.println("成功釋放資源");
}
}
private static void demo(String fileName) throws IOException {
if(!fileName.endsWith(".txt")){
throw new IOException("file type error" );
}else {
System.out.println("file read OK");
}
}
}
總結(jié)

異常處理.png