Java的知识点19——异常机制Exception
異常(Exception)的概念
異常指程序運行過程中出現的非正常現象,例如用戶輸入錯誤、除數為零、需要處理的文件不存在、數組下標越界等。
Java是采用面向對象的方式來處理異常的。處理過程:
? ? ? 1.?拋出異常:在執行一個方法時,如果發生異常,則這個方法生成代表該異常的一個對象,停止當前執行路徑,并把異常對象提交給JRE。
? ? ??2. ?捕獲異常:JRE得到該異常后,尋找相應的代碼來處理該異常。JRE在方法的調用棧中查找,從生成異常的方法開始回溯,直到找到相應的異常處理代碼為止。
異常分類
? ? ? ? JDK 中定義了很多異常類,這些類對應了各種各樣可能出現的異常事件,所有異常對象都是派生于Throwable類的一個實例。如果內置的異常類不能夠滿足需要,還可以創建自己的異常類。
?Error:Java虛擬機運行錯誤(Virtual MachineError),當 JVM 不再有繼續執行操作所需的內存資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。
Exception:?Exception是程序本身能夠處理的異常,如:空指針異常(NullPointerException)、數組下標越界異常(ArrayIndexOutOfBoundsException)、類型轉換異常(ClassCastException)、算術異常(ArithmeticException)等。
?通常Java的異常可分為:
? ? ??1. RuntimeException 運行時異常
? ? ??2. CheckedException 已檢查異常
RuntimeException運行時異常:? 派生于RuntimeException的異常,如被 0 除、數組下標越界、空指針等,其產生比較頻繁,處理麻煩,如果顯式的聲明或捕獲將會對程序可讀性和運行效率影響很大。 因此由系統自動檢測并將它們交給缺省的異常處理程序(用戶可不必對其處理)。這類異常通常是由編程錯誤導致的,所以在編寫程序時,并不要求必須使用異常處理機制來處理這類異常,經常需要通過增加“邏輯處理來避免這些異常”。
NumberFormatException異常
package cn.dym09; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test03 {public static void main(String[] args) {String str="45645wefrewgf";Pattern p=Pattern.compile("^\\d+$");Matcher m=p.matcher(str);if(m.matches()) {//如果str匹配代表數字的正則表達式,才會轉換System.out.println(Integer.parseInt(str));}} }CheckedException:IOException、SQLException等以及用戶自定義的Exception異常。 這類異常在編譯時就必須做出處理,否則無法通過編譯。
異常的處理方式有兩種:使用“try/catch”捕獲異常、使用“throws”聲明異常。
捕獲異常:?捕獲異常是通過3個關鍵詞來實現的:try-catch-finally。用try來執行一段程序,如果出現異常,系統拋出一個異常,可以通過它的類型來捕捉(catch)并處理它,最后一步是通過finally語句為異常處理提供一個統一的出口,finally所指定的代碼都要被執行(catch語句可有多條;finally語句最多只能有一條,根據自己的需要可有可無)。
注:?一個try語句必須帶有至少一個catch語句塊或一個finally語句塊 。
? ? ? ?catch:?u-toString ()方法,顯示異常的類名和產生異常的原因
? ? ? ? ? ? ? ? ? ? ?u-getMessage()方法,只顯示產生異常的原因,但不顯示類名。
? ? ? ? ? ? ? ? ? ? u-printStackTrace()方法,用來跟蹤異常事件發生時堆棧的內容。
? ? ? ? ? ? ? ? ? ? catch捕獲異常時的捕獲順序:如果異常類之間有繼承關系,在順序安排上需注意。越是頂層的類,越放在下面,再不然就直接把多余的catch省略掉。 也就是先捕獲子類異常再捕獲父類異常。
? ? ? ?finally:finally中關閉程序塊已打開的資源,比如:關閉文件流、釋放數據庫連接等。
注:1. 即使try和catch塊中存在return語句,finally語句也會執行。是在執行完finally語句后再通過return退出。
? ? ? ? ? ? ? ? ? 2. finally語句塊只有一種情況是不會執行的,那就是在執行finally之前遇到了System.exit(0)結束程序運行。
package cn.dym09; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Test05 {public static void main(String[] args) {FileReader reader=null;try {reader =new FileReader("d://a.txt");char c=(char) reader.read();char c2=(char)reader.read();}catch(FileNotFoundException e){e.printStackTrace();}catch(IOException e) {e.printStackTrace();}finally {try {if(reader!=null) {reader.close();}}catch(Exception e){e.printStackTrace();}}} }throws:?當CheckedException產生時,不一定立刻處理它,可以再把異常throws出去。在方法中使用try-catch-finally是由這個方法來處理異常。但是在一些情況下,當前方法并不需要處理發生的異常,而是向上傳遞給調用它的方法處理。?如果一個方法拋出多個已檢查異常,就必須在方法的首部列出所有的異常,之間以逗號隔開。
package cn.dym09; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;public class Test06 {public static void main(String[] args) {try {readFile("joke.txt");}catch(FileNotFoundException e) {System.out.println("所需文件不存在!");}catch(IOException e) {System.out.println("文件讀寫錯誤!");}}public static void readFile(String fileName) throws FileNotFoundException,IOException{FileReader in=new FileReader(fileName);int tem=0;try {tem=in.read();while(tem!=-1) {System.out.print((char)tem);tem=in.read();}}finally {in.close();}} }注:?1. 方法重寫中聲明異常原則:子類重寫父類方法時,如果父類方法有聲明異常,那么子類聲明的異常范圍不能超過父類聲明的范圍。
自定義異常:自定義異常類應該包含2個構造器:一個是默認的構造器,另一個是帶有詳細信息的構造器。
package cn.dym09;class IllegalAgeException extends Exception{//默認構造器public IllegalAgeException() {super(); }//帶有詳細信息的構造器,信息存儲在message中public IllegalAgeException(String message) {super(message); } }class Person{private String name;private int age;public void setName(String name) {this.name=name;}public void setAge(int age) throws IllegalAgeException{if(age<0) {throw new IllegalAgeException("人的年齡不應該為負數");}this.age=age;}public String toString() {return "name is "+name+" and age is "+age;} }public class Test07 {public static void main(String[] args) {Person p=new Person();try {p.setName("代止兮");p.setAge(-9);}catch(IllegalAgeException e) {e.printStackTrace();System.exit(-1);}System.out.println(p);} }使用異常機制的建議:1.要避免使用異常處理代替錯誤處理,這樣會降低程序的清晰性,并且效率低下。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.處理異常不可以代替簡單測試---只在異常情況下使用異常機制。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3.不要進行小粒度的異常處理---應該將整個任務包裝在一個try語句塊中。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4.異常往往在高層處理
總結
以上是生活随笔為你收集整理的Java的知识点19——异常机制Exception的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的知识点18——数组存储表格数据
- 下一篇: Java的知识点20——包装类基本知识、