Java異常可以分為可檢測(cè)異常,非檢測(cè)異常:
? ?- 可檢測(cè)異常:
? ?可檢測(cè)異常經(jīng)編譯器驗(yàn)證,對(duì)于聲明拋出異常的任何方法,編譯器將強(qiáng)制執(zhí)行處理或聲明規(guī)則,不捕捉這個(gè)異常,編譯器就通不過(guò),不允許編譯
- 非檢測(cè)異常:非檢測(cè)異常不遵循處理或者聲明規(guī)則。在產(chǎn)生此類異常時(shí),不一定非要采取任何適當(dāng)操作,編譯器不會(huì)檢查是否已經(jīng)解決了這樣一個(gè)異常
? - RuntimeException 類
? ? 屬于非檢測(cè)異常,因?yàn)槠胀↗VM操作引起的運(yùn)行時(shí)異常隨時(shí)可能發(fā)生,此類異常一般是由特定操作引發(fā)。但這些操作在java應(yīng)用程序中會(huì)頻繁出現(xiàn)。因此它們不受編譯器檢查與處理或聲明規(guī)則的限制。
? 常見(jiàn)的RuntimeException子類
- IllegalArgumentException:拋出的異常表明向方法傳遞了一個(gè)不合法或不正確的參數(shù)
- NullPointerException:當(dāng)應(yīng)用程序試圖在需要對(duì)象的地方使用 null 時(shí),拋出該異常
- ArrayIndexOutOfBoundsException:當(dāng)使用的數(shù)組下標(biāo)超出數(shù)組允許范圍時(shí),拋出該異常
- ClassCastException:當(dāng)試圖將對(duì)象強(qiáng)制轉(zhuǎn)換為不是實(shí)例的子類時(shí),拋出該異常
- NumberFormatException:當(dāng)應(yīng)用程序試圖將字符串轉(zhuǎn)換成一種數(shù)值類型,但該字符串不能轉(zhuǎn)換為適當(dāng)格式時(shí),拋出該異常。
異常中常用的方法
package exception;
/**
?* 異常常見(jiàn)的方法
?*/
public class ExceptionApiDemo {
? ? public static void main(String[] args) {
? ? ? ? System.out.println("程序開(kāi)始了");
? ? ? ? try {
? ? ? ? ? ? String str = "abc";
? ? ? ? ? ? System.out.println(Integer.parseInt(str));
? ? ? ? } catch (NumberFormatException e) {
? ? ? ? ? ? //異常最常用的方法,用于將當(dāng)前錯(cuò)誤信息輸出到控制臺(tái)
? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? //獲取錯(cuò)誤消息.記錄日志的時(shí)候或提示給用戶可以使用它
? ? ? ? ? ? String message = e.getMessage();
? ? ? ? ? ? System.out.println(message);
? ? ? ? }
? ? ? ? System.out.println("程序結(jié)束了");
? ? }
}
?自定義異常
? ? 自定義異常通常用來(lái)定義那些業(yè)務(wù)上的異常問(wèn)題。
? ? 定義自定義異常需要注意以下問(wèn)題:
? ? - 異常的類名要做到見(jiàn)名知義
? ?- 需要是Exception的子類
? ?- 提供超類異常提供的所有種類構(gòu)造器
package exception;
/**
?* 非法的年齡異常
?*
?* 自定義異常通常用來(lái)說(shuō)明業(yè)務(wù)上的錯(cuò)誤.
?* 自定義異常要注意以下問(wèn)題:
?* 1:定義的類名要做到見(jiàn)名知義
?* 2:必須是Exception的子類
?* 3:提供Exception所定義的所有構(gòu)造方法
?*/
public class IllegalAgeException extends Exception{
? ? public IllegalAgeException() {
? ? }
? ? public IllegalAgeException(String message) {
? ? ? ? super(message);
? ? }
? ? public IllegalAgeException(String message, Throwable cause) {
? ? ? ? super(message, cause);
? ? }
? ? public IllegalAgeException(Throwable cause) {
? ? ? ? super(cause);
? ? }
? ? public IllegalAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
? ? ? ? super(message, cause, enableSuppression, writableStackTrace);
? ? }
}
package exception;
/**
?* 測(cè)試異常的拋出
?*/
public class Person {
? ? private int age;
? ? public int getAge() {
? ? ? ? return age;
? ? }
? ? /**
? ? ?* 當(dāng)一個(gè)方法使用throws聲明異常拋出時(shí),調(diào)用此方法的代碼片段就必須處理這個(gè)異常
? ? ?*/
? ? public void setAge(int age) throws IllegalAgeException {
? ? ? ? if(age<0||age>100){
? ? ? ? ? ? //使用throw對(duì)外拋出一個(gè)異常
// ? ? ? ? ? ?throw new RuntimeException("年齡不合法!");
? ? ? ? ? ? //除了RuntimeException之外,拋出什么異常就要在方法上聲明throws什么異常
// ? ? ? ? ? ?throw new Exception("年齡不合法!");
? ? ? ? ? ? //拋出自定義異常
? ? ? ? ? ? throw new IllegalAgeException("年齡超范圍:"+age);
? ? ? ? }
? ? ? ? this.age = age;
? ? }
}
package exception;
/**
?* throw關(guān)鍵字,用于主動(dòng)對(duì)外拋出一個(gè)異常
?*/
public class ThrowDemo {
? ? public static void main(String[] args){
? ? ? ? System.out.println("程序開(kāi)始了...");
? ? ? ? try {
? ? ? ? ? ? Person p = new Person();
? ? ? ? ? ? /*
? ? ? ? ? ? ? ? 當(dāng)我們調(diào)用一個(gè)含有throws聲明異常拋出的方法時(shí),編譯器要求
? ? ? ? ? ? ? ? 我們必須添加處理異常的手段,否則編譯不通過(guò).而處理手段有兩種
? ? ? ? ? ? ? ? 1:使用try-catch捕獲并處理異常
? ? ? ? ? ? ? ? 2:在當(dāng)前方法上繼續(xù)使用throws聲明該異常的拋出
? ? ? ? ? ? ? ? 具體用哪種取決于異常處理的責(zé)任問(wèn)題
? ? ? ? ? ? ?*/
? ? ? ? ? ? p.setAge(100000);//典型的符合語(yǔ)法,但是不符合業(yè)務(wù)邏輯要求
? ? ? ? ? ? System.out.println("此人年齡:"+p.getAge()+"歲");
? ? ? ? } catch (IllegalAgeException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? System.out.println("程序結(jié)束了...");
? ? }
}
總結(jié):
? ? ?
? ? ? ?異常處理是處理程序中可能發(fā)生的錯(cuò)誤或異常情況的一種機(jī)制。異常是在程序執(zhí)行期間出現(xiàn)的問(wèn)題,它們可以是編譯時(shí)異?;蜻\(yùn)行時(shí)異常。以下是詳細(xì)總結(jié):
-
異常分類:
- 編譯時(shí)異常(Checked Exception):這些異常在編譯期間會(huì)被檢查到,需要顯式地處理或聲明拋出,否則編譯器會(huì)報(bào)錯(cuò)。例如:IOException、SQLException等。
- 運(yùn)行時(shí)異常(Unchecked Exception):這些異常在編譯期間不會(huì)被強(qiáng)制檢查,可以選擇處理或不處理。例如:NullPointerException、ArrayIndexOutOfBoundsException等。
-
異常處理語(yǔ)句:
- try-catch:使用該語(yǔ)句塊來(lái)捕獲可能會(huì)拋出異常的代碼。當(dāng)try塊中的代碼發(fā)生異常時(shí),會(huì)立即轉(zhuǎn)到catch塊中執(zhí)行相應(yīng)的處理代碼。
- try-finally:使用該語(yǔ)句塊來(lái)確保無(wú)論是否發(fā)生異常,最終都會(huì)執(zhí)行finally塊中的代碼。
- try-catch-finally:可以結(jié)合使用try、catch和finally塊來(lái)處理異常。try塊中的代碼發(fā)生異常時(shí),執(zhí)行對(duì)應(yīng)的catch塊,當(dāng)try塊中的代碼執(zhí)行完畢或發(fā)生異常時(shí),都會(huì)執(zhí)行finally塊中的代碼。
-
異常處理順序:
- 當(dāng)一個(gè)方法可能會(huì)拋出多個(gè)異常時(shí),應(yīng)該將捕獲范圍小的異常放在前面,捕獲范圍大的異常放在后面。這是因?yàn)镴ava編譯器在檢查異常捕獲時(shí)是按照順序匹配的,如果將范圍大的異常放在前面,會(huì)導(dǎo)致之后的異常無(wú)法被捕獲。
-
異常處理的關(guān)鍵字:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-815931.html
- throw:用于手動(dòng)拋出異常。可以通過(guò)實(shí)例化異常對(duì)象并將其作為參數(shù)傳遞給throw語(yǔ)句來(lái)拋出自定義異?;騄ava內(nèi)置異常。
- throws:用于聲明方法可能拋出的異常。當(dāng)方法中可能會(huì)拋出異常,但不想在方法內(nèi)部處理時(shí),可以使用throws關(guān)鍵字在方法簽名中聲明異常,將異常拋給調(diào)用者處理。
-
自定義異常:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-815931.html
- 可以自定義異常類來(lái)表示特定的異常情況。自定義異常類通常繼承自Exception或RuntimeException類。
- 自定義異常類應(yīng)該包含至少兩個(gè)構(gòu)造函數(shù),一個(gè)是無(wú)參構(gòu)造函數(shù),另一個(gè)是帶有詳細(xì)信息的構(gòu)造函數(shù)。通過(guò)重寫Exception的getMessage()方法,可以返回自定義異常的詳細(xì)信息。
到了這里,關(guān)于java--異常類的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!