標籤:color 體系圖 動作 finalize 異常處理 不可 記憶體回收行程 strong static
什麼是異常:
異常就是Java程式在運行過程中出現的錯誤。
騷話:
世界上最真情的相依就是你在try我在catch,無論你發什麼脾氣,我都靜靜接受,默默處理(這個可以不記)
異常繼承體系圖:
異常處理的方式:
try{
用來檢測異常的
} catch(){
用來捕獲異常的
}finally{
一定會執行的語句。
}
throws:聲明方法可能要拋出的異常。
throw:手動拋出異常。
異常處理方式(Java提供特有的語句進行處理異常):
1 public class Demo1 { 2 public int Demo1(int a,int b)throws Exception{ 3 //功能上通過throws 關鍵字聲明該功能可能出現問題。 4 //調用者必須在主函數拋出此異常(throws Exception)或者捕獲該異常(try catch) 5 return a/b; 6 } 7 public static void main(String[] args) { 8 Demo1 de = new Demo1(); 9 try {10 int demo1 = de.Demo1(1, 0);11 System.out.println(demo1);12 } catch (Exception e) {//Exception e = new ArithmeticException();13 System.out.println("除數不能為零");14 System.out.println(e.getMessage()); //擷取異常資訊15 System.out.println(e.toString()); //調用toString方法,列印異常類型和異常資訊16 e.printStackTrace(); //jvm預設就用這種方式處理異常17 }finally{ 18 System.out.println("十年飲冰,難涼熱血");//finally中的代碼一定會執行19 }20 }21 }
自訂異常:
項目中出現特有的異常,這些異常沒有被Java描述並封裝進對象。
對這些特有的異常問題可以按照Java對問題封裝的思想。將特有的問題。進行自訂封裝
當函數內部出現throw拋出異常對象,那麼就必須對應的處理動作。(1.try catch 2.函數上聲明讓調用者處理)。
異常分為兩種異常:
編譯時間異常:在編譯某個程式的時候,有可能有這樣那樣的事情發生,比如檔案找不到,這樣的異常就必須在編譯的時候處理,如果不處理就編譯不過。
運行時異常:就是程式員所犯得錯誤,需要回來修改代碼
面試題:
1.throws與throw的區別:
throws: throw:
* 用在方法聲明後面,跟的是異常類名 * 用在方法體內,跟的是異常對象名
* 可以跟多個異常類名,用逗號隔開 * 只能拋出一個異常對象名
* 表示拋出異常,由該方法的調用者來處理 * 表示拋出異常,由方法體內的語句處理
2.final,finally和finalize的區別:
*final:可以修飾類-被其修飾的類不能被繼承 修飾方法-不能被重寫 修飾變數-只能被賦值一次
*finally:是try語句中的一個語句體,不能單獨使用,用來釋放資源的
* finalize:finalize()是一個方法,當記憶體回收期確定不存在的對象的更多引用時,由對象的記憶體回收行程調用此方法
3.如果catch裡面有return語句,請問finally的代碼還會執行嗎?如果會,請問是在return前還是return後。
1 public class Demo1_Demo1 { 2 public static void main(String[] args) { 3 Demo dm = new Demo(); 4 int dr = dm.getDemo(); 5 System.out.println(dr); 6 } 7 } 8 class Demo{ 9 public int getDemo(){10 int x =10;11 try {12 System.out.println(1/0);13 x=20;14 return x;15 } catch (Exception e) {16 x=30;17 return x; //先建立一個隧道,執行完Filally釋放完資源,隧道不會改變,所以值還是3018 }finally{ //千萬不要在finally裡面寫返回語句,因為finally的作用是用來釋放資源的,19 x=40; //肯定會被執行,如果在裡面寫返回語句,那麼try和catch的結果都會改變,所以這麼寫就是~ 20 }21 }22 }
異常注意事項:
* a:子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)
* b:如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常
* c:如果被重寫的方法沒有異常拋出,那麼子類的方法絕對不可以拋出異常,如果子類方法內有異常發生,那麼子類只能try,不能throws
Java異常超詳細總結