做相框的網(wǎng)站富陽網(wǎng)站seo價格
目錄
一.異常的概念與體系結(jié)構(gòu):
1.1異常的概念:
1.2一些常見的異常:
1.3異常的體系結(jié)構(gòu):
1.4異常的分類:
二.異常的處理機(jī)制:
2.1?拋出異常:
2.2異常的捕獲:
?2.3try-catch-(finally)捕獲并處理:
?2.4Throwable類中的常用方法:
三.自定義異常:
java中常見的異常:
1. runtimeException子類:
2.IOException
一.異常的概念與體系結(jié)構(gòu):
1.1異常的概念:
具體來說:
😀😀😀異常指不期而至的各種狀況,如:文件找不到、網(wǎng)絡(luò)連接失敗、非法參數(shù)等。異常是一個事件,它發(fā)生在程序運行期間,干擾了正常的指令流程。Java通 過API中Throwable類的眾多子類描述各種不同的異常。因而,Java異常都是對象,是Throwable子類的實例,描述了出現(xiàn)在一段編碼中的錯誤條件。當(dāng)條件生成時,錯誤將引發(fā)異常。
1.2一些常見的異常:
?①.算術(shù)異常:
?②.數(shù)組越界異常:
?③.空指針異常:
從上述過程中可以看到,👌👌java中不同類型的異常,都有與其對應(yīng)的類來進(jìn)行描述。
1.3異常的體系結(jié)構(gòu):
?從上圖中我們可以看出:
- 🐻🐻🐻Throwable:是異常體系的頂層類,其派生出兩個重要的子類, Error 和 Exception
- 🐻🐻🐻Error : 指的是 Java 虛擬機(jī)無法解決的嚴(yán)重問題,比如: JVM 的內(nèi)部錯誤、資源耗盡等 ,典型代表: StackOverflowError 和 OutOfMemoryError ,一旦發(fā)生回力乏術(shù)。
- Exception : 異常產(chǎn)生后程序員可以通過代碼進(jìn)行處理,使程序繼續(xù)執(zhí)行。
1.4異常的分類:
通常,Java的異常(包括Exception和Error)分為可查的異常(checked exceptions)和不可查的異常(unchecked exceptions)。
🦉🦉🦉可查異常(編譯器要求必須處置的異常):正確的程序在運行中,很容易出現(xiàn)的、情理可容的異常狀況??刹楫惓km然是異常狀況,但在一定程度上它的發(fā)生是可以預(yù)計的,而且一旦發(fā)生這種異常狀況,就必須采取某種方式進(jìn)行處理。
?🦉🦉🦉不可查異常(編譯器不要求強(qiáng)制處置的異常):包括運行時異常(RuntimeException與其子類)和錯誤(Error)。
①.🧐🧐運行時異常(RuntimeException):
在程序執(zhí)行期間發(fā)生的異常,稱為運行時異常,也稱為非受檢查異常 (Unchecked Exception)RunTimeException 以及其子類對應(yīng)的異常,都稱為運行時異常 。比如: NullPointerException 、ArrayIndexOutOfBoundsException 、 ArithmeticException 。(上面的常見異常例子)②.🧐🧐編譯時異常,又稱檢查異常(Checked Exception):
是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進(jìn)行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。
二.異常的處理機(jī)制:
🧐🧐🧐在 Java 應(yīng)用程序中,異常處理機(jī)制為:拋出異常,捕捉異常。
?拋出異常和捕捉異常
- 🦉🦉🦉?拋出異常:當(dāng)一個方法出現(xiàn)錯誤引發(fā)異常時,方法創(chuàng)建異常對象并交付運行時系統(tǒng),異常對象中包含了異常類型和異常出現(xiàn)時的程序狀態(tài)等異常信息。運行時系統(tǒng)負(fù)責(zé)尋找處置異常的代碼并執(zhí)行。
- 🦉🦉🦉 捕獲異常:在方法拋出異常之后,運行時系統(tǒng)將轉(zhuǎn)為尋找合適的異常處理器(exception handler)。潛在的異常處理器是異常發(fā)生時依次存留在調(diào)用棧中的方法的集合。當(dāng)異常處理器所能處理的異常類型與方法拋出的異常類型相符時,即為合適 的異常處理器。運行時系統(tǒng)從發(fā)生異常的方法開始,依次回查調(diào)用棧中的方法,直至找到含有合適異常處理器的方法并執(zhí)行。當(dāng)運行時系統(tǒng)遍歷調(diào)用棧而未找到合適 的異常處理器,則運行時系統(tǒng)終止。同時,意味著Java程序的終止。
2.1?拋出異常:
?舉個例子:
public class TestException {public static void main(String[] args) {int[] array = {1,2,3};getElement(array,3);}public static int getElement(int[] array,int index){if(array == null){//在方法體內(nèi)部拋出異常throw new NullPointerException("傳遞的數(shù)組為null");}if(index < 0 || index >= array.length){throw new ArrayIndexOutOfBoundsException("傳遞的數(shù)組下表越界");}return array[index];}
}
運行結(jié)果(這里取了不存在的數(shù)組下標(biāo),拋出數(shù)組越界異常):
🧐!!!拋出異常的注意事項:
- 🐞🐞🐞throw必須寫在方法體內(nèi)部
- 🦉🦉拋出的對象必須是 Exception 或者 Exception 的子類對象
- 🦉🦉如果拋出的是 RunTimeException 或者 RunTimeException 的子類,則可以不用處理,直接交給 JVM 來處理
- 🦉🦉如果拋出的是編譯時異常,用戶必須處理,否則無法通過編譯
- 🐞🐞🐞異常一旦拋出,其后的代碼就不會執(zhí)行
2.2異常的捕獲:
🐻🐻🐻處在方法聲明時參數(shù)列表之后,當(dāng)方法中拋出編譯時異常,用戶不想處理該異常,此時就可以借助 throws 將異常拋給方法的調(diào)用者來處理。即當(dāng)前方法不處理異常,提醒方法的調(diào)用者處理異常 。
語法格式:
語法格式:
修飾符 返回值類型 方法名(參數(shù)列表) throws 異常類型1,異常類型2...{
}
舉個例子:
class Person implements Cloneable{String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class TestException {public static void main(String[] args) throws CloneNotSupportedException{Person person = new Person("坤坤",18);Person person1 = (Person)person.clone();System.out.println(person1);}}
運行結(jié)果:
🐻🐻🐻?調(diào)用聲明拋出異常的方法時,調(diào)用者必須對該異常進(jìn)行處理,或者繼續(xù)使用throws拋出
注意事項:
- 🐞🐞🐞throws必須跟在方法的參數(shù)列表之后
🐞🐞🐞聲明的異常必須是 Exception 或者 Exception 的子類 🐞🐞🐞方法內(nèi)部如果拋出了多個異常, throws 之后必須跟多個異常類型,之間用逗號隔開,如果拋出多個異常類型 具有父子關(guān)系,直接聲明父類即可。
?2.3try-catch-(finally)捕獲并處理:
try {// 可能會發(fā)生異常的程序代碼} catch (Type1 id1) {// 捕獲并處理try拋出的異常類型Type1} catch (Type2 id2) {// 捕獲并處理try拋出的異常類型Type2} finally {// 無論是否發(fā)生異常,都將執(zhí)行的語句塊}// 后序代碼
// 當(dāng)異常被捕獲到時,異常就被處理了,這里的后序代碼一定會執(zhí)行
// 如果捕獲了,由于捕獲時類型不對,那就沒有捕獲到,這里的代碼就不會被執(zhí)行
?try-catch-finally 規(guī)則(異常處理語句的語法規(guī)則):
- 🐞 必須在 try 之后添加 catch 或 finally 塊。try 塊后可同時接 catch 和 finally 塊,但至少有一個塊。
- 🐞必須遵循塊順序:若代碼同時使用 catch 和 finally 塊,則必須將 catch 塊放在 try 塊之后。
- 🐞一個 try 塊可能有多個 catch 塊。若如此,則執(zhí)行第一個匹配塊。即Java虛擬機(jī)會把實際拋出的異常對象依次和各個catch代碼塊聲明的異常類型匹配,如果異常對象為某個異常類型或其子類的實例,就執(zhí)行這個catch代碼塊,不會再執(zhí)行其他的 catch代碼塊
舉個例子:
public class TestException {public static void main(String[] args) {try {int[] array = null;System.out.println(array.length);}catch (ArithmeticException e) {e.printStackTrace();System.out.println("處理ArithmeticException異常....");}catch (NullPointerException e) {e.printStackTrace();System.out.println("處理NullPointerException異常....");}finally {System.out.println("finally中的代碼一定會執(zhí)行~");}System.out.println("后續(xù)代碼程序繼續(xù)執(zhí)行.....");}
}
運行結(jié)果(拋出空指針異常):
🧐🧐try-catch-finally語句塊執(zhí)行
?2.4Throwable類中的常用方法:
- getCause():返回拋出異常的原因。如果 cause 不存在或未知,則返回 null。
- ?getMeage():返回異常的消息信息。
- printStackTrace():對象的堆棧跟蹤輸出至錯誤輸出流,作為字段 System.err 的值。
三.自定義異常:
- 🐻🐻🐻自定義異常類,然后繼承自 Exception 或者 RunTimeException
- 🐻🐻🐻實現(xiàn)一個帶有 String 類型參數(shù)的構(gòu)造方法,參數(shù)含義:出現(xiàn)異常的原因
import java.lang.Exception;
public class TestException {static int quotient(int x, int y) throws MyException { // 定義方法拋出異常if (y < 0) { // 判斷參數(shù)是否小于0throw new MyException("除數(shù)不能是負(fù)數(shù)"); // 異常信息}return x/y; // 返回值}public static void main(String args[]) { // 主方法int a =3;int b =0;try { // try語句包含可能發(fā)生異常的語句int result = quotient(a, b); // 調(diào)用方法quotient()} catch (MyException e) { // 處理自定義異常System.out.println(e.getMessage()); // 輸出異常信息} catch (ArithmeticException e) { // 處理ArithmeticException異常System.out.println("除數(shù)不能為0"); // 輸出提示信息} catch (Exception e) { // 處理其他異常System.out.println("程序發(fā)生了其他的異常"); // 輸出提示信息}}}
class MyException extends Exception { // 創(chuàng)建自定義異常類,繼承父類ExceptionString message; // 定義String類型變量public MyException(String ErrorMessagr) { // 父類方法message = ErrorMessagr;}public String getMessage() { // 覆蓋getMessage()方法return message;}
}
注意事項:
- 🦉🦉🦉自定義異常通常會繼承自 Exception 或者 RuntimeException
- 🦉🦉🦉繼承自 Exception 的異常默認(rèn)是受查異常
- 🦉🦉🦉繼承自 RuntimeException 的異常默認(rèn)是非受查異常
java中常見的異常:
1. runtimeException子類:
- ? ? ?java.lang.ArrayIndexOutOfBoundsException
- ? ? 數(shù)組索引越界異常。當(dāng)對數(shù)組的索引值為負(fù)數(shù)或大于等于數(shù)組大小時拋出。
- ? ? java.lang.ArithmeticException
- ? ? 算術(shù)條件異常。譬如:整數(shù)除零等。
- ? ? java.lang.NullPointerException
- ? ? 空指針異常。當(dāng)應(yīng)用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調(diào)用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出null等等
- ? ? java.lang.ClassNotFoundException
- ? ? 找不到類異常。當(dāng)應(yīng)用試圖根據(jù)字符串形式的類名構(gòu)造類,而在遍歷CLASSPAH之后找不到對應(yīng)名稱的class文件時,拋出該異常。
- ? ?java.lang.NegativeArraySizeException ?數(shù)組長度為負(fù)異常
- ? ?java.lang.ArrayStoreException 數(shù)組中包含不兼容的值拋出的異常
- ? ?java.lang.SecurityException 安全性異常
- ? ?java.lang.IllegalArgumentException 非法參數(shù)異常
2.IOException
- IOException:操作輸入流和輸出流時可能出現(xiàn)的異常。
- EOFException ? 文件已結(jié)束異常
- FileNotFoundException ? 文件未找到異常
參考文章:java(3)-深入理解java異常處理機(jī)制_java處理異常-CSDN博客?
結(jié)語:?寫博客不僅僅是為了分享學(xué)習(xí)經(jīng)歷,同時這也有利于我鞏固自己的知識點,總結(jié)該知識點,由于作者水平有限,對文章有任何問題的還請指出,接受大家的批評,讓我改進(jìn)。同時也希望讀者們不吝嗇你們的點贊+收藏+關(guān)注,你們的鼓勵是我創(chuàng)作的最大動力!