第74-75集:異常機制、trycatchfinallyreturn執行順序、捕獲異常、聲明異常throw、方法重寫中異常的處理、手動拋出異常
異常的處理辦法一:捕獲異常
try
try語句指定了一段代碼,該段代碼就是一次捕獲并處理的范圍。在執行過程中,當任意一條語句產生異常時,就會跳過該段中后面的代碼。代碼中可能會產生并拋出一種或幾種類型的異常對象,它后面的catch語句要分別對這些異常做相應的處理。
一個try語句必須帶有至少一個catch語句塊或一個finally語句塊?。【只有try和finally未必可以】
當異常處理的代碼執行結束以后,是不會回到try語句去執行尚未執行的代碼。
catch
每個try語句塊可以伴隨一個或多個catch語句,用于處理可能產生的不同類型的異常對象。
常用方法:
toString?(?):顯示異常的類名和產生異常的原因。
getMessage(?):只顯示產生異常的原因,但不顯示類名。
printStackTrace(?):用來跟蹤異常事件發生時堆棧的內容。【最常用】
這些方法均繼承自Throwable類?
Catch捕獲異常時的捕獲順序: ?
如果異常類之間有繼承關系,在順序安排上需注意。越是頂層的類,越放在下面。再不然就直接把多余的catch省略掉。?
finally
有些語句,不管是否發生了異常,都必須要執行,那么就可以把這樣的語句放到finally語句塊中。
通常在finally中關閉程序塊已打開的資源,比如:文件流、釋放數據庫連接等。
package com.test074;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class Test074 {public static void main(String[] args){FileReader reader = null;File a = new File("/Users/wangtao/Desktop/a.txt");try{a.createNewFile();reader = new FileReader("/Users/wangtao/Desktop/a.txt");char temp = (char)reader.read();System.out.println("讀出的內容"+temp);} catch(FileNotFoundException e){System.out.println("文件沒有找到");} catch(IOException e){e.printStackTrace();System.out.println("文件讀取錯誤");} finally {System.out.println("不管有無異常都將被執行");try {reader.close();//這是一個用來關閉對象的方法} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}
try、catch、finally、return執行順序
執行try,catch,給返回值賦值
執行finally
return
package com.test074;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class Test074_1 {public static void main(String[] args){String str = new Test074_1().openFile();System.out.println(str);}String openFile(){try{System.out.println("aaa");FileInputStream fis = new FileInputStream("/Users/wangtao/Desktop/a.txt");int a = fis.read();System.out.println("bbb");return "step1";} catch(FileNotFoundException e) {System.out.println("catch");e.printStackTrace();return "step2";//先去finally再回到這里。} catch(IOException e){e.printStackTrace();return "step3";} finally {System.out.println("finally!!!");//return "FFF";//不要在finally中使用return}}
}
異常的處理辦法二:聲明異常:throws子句
當Checked?Exception產生時,不一定立刻處理它,可以再把異常Throws出去。
在方法中使用try-chatch-finally這個方法處理異常。在一些情況下,當前方法并不需要處理發生的異常,而是向上傳遞給調用它的方法處理。
如果一個方法中可能產生某種異常,但是并不能確定如何處理這種異常,則應根據異常規范在方法的首部聲明該方法可能拋出的異常。
如果一個方法拋出多個已檢查異常,就必須在方法的首部列出所有的異常,之間以逗號隔開。
方法重寫中聲明異常原則:子類聲明的異常范圍不能超過父類聲明的范圍。包含如下意思:
父類沒有聲明異常,子類也不能。
不可拋出原有方法拋出異常類的父類或上層類。
拋出的異常類型的數目不可以比原有的方法拋出的還多(不是指個數)。
package com.test075;import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;/*** @author wangtao* 測試子類重寫父類方法* 1. 子類拋出的異常不能是父類的上層類,其范圍也不能超過父類* 2. 子類拋出的異常種類不能比父類多* 3. 父類不拋出異常,子類不能拋出。* */
public class Test075_1 {public static void main(String[] args){}class A {public void method() throws IOException{}}class B extends A {public void method() throws FileNotFoundException{//子類拋出的異常范圍不超過父類范圍}}class C extends A {public void method(){//子類不拋出異常}}class D extends A {public void method() throws IOException,ParseException{//子類拋出的異常種類比父類多,報錯}}class E extends A {public void method() throws IOException,FileNotFoundException{//子類拋出的異常范圍數量雖然多過父類,但是它沒有超過父類范圍}}class F extends A {public void method() throws IOException,ArithmeticException{//同上}}
}
異常的處理辦法三:手動拋出異常
Java異常類對象除在程序執行過程中出現異常時由系統自動生成并拋出,也可根據需要手工創建并拋出。
在捕獲一個異常前,必須有一段代碼先生成異常對象并把它拋出。這個過程我們可以手工做,也可以由JRE來實現,但是他們調用的都是throw子句。
對于一個已經存在的異常類,拋出該類異常對象過程如下:
找到一個合適的異常類。
創建一個該類的對象。
將對象拋出。
package com.test075;import java.io.File;
import java.io.FileNotFoundException;public class Test075_2 {public static void main(String[] args){File f = new File("/Users/wangtao/Desktop/aaa.txx");if(!f.exists()){try {throw new FileNotFoundException("File can`t be found!");} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}
第76集:異常機制、自定義異常、異常總結
自定義異常? ? ? ? ? ? ? ?
在程序中,可能會遇到任何標準異常類都沒有充分的描述清楚的問題,這種情況下可以創建自己的異常類【從Exception類或者它的子類派生一個子類即可】
習慣上,定義的類應該包含2個構造器:一個是默認的構造器,另一個是帶有詳細信息的構造器
package com.test076;/*** @author wangtao* 測試自定義異常*/
public class Test076 {public static void main(String[] args){try {new TestMyException().test();} catch (MyException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}class MyException extends Exception {public MyException(){}public MyException(String message){super(message);}
}class TestMyException{void test() throws MyException {}
}
使用異常機制建議
要避免使用異常處理代替錯誤處理,這樣會降低程序的清晰性,并且效率低下。
處理異常不可以代替簡單測試---?只在異常情況下使用異常機制?
不要進行小粒度的異常處理---應該將整個任務包裝在一個Try語句塊中?
異常往往在高層處理(先了解!后面做項目會說!)?
總結
一個圖
五個關鍵字(try,catch,finally,throws,throw)
先逮小的,再逮大的
異常和重寫的關系
自定義異常
總結
以上是生活随笔為你收集整理的【135天】尚学堂高淇Java300集视频精华笔记(74-76)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。