1. java自定義異常,應該繼承Exception還是Runtime Exception,為什麼
/*
RuntimeException屬於Exception的子類
Exception是在編譯時候如果有異常就可以檢查出來,比較嚴謹!
RuntimeException比較特殊,他及其子類對象,屬於運行時候檢查的異常,如果語法沒有錯誤
他不會在編譯時候報異常的,只有運行的時候才會拋出異常!
至於繼承誰,得看你的類具體的功能,其實這兩點已經說的很明確了,如果你繼承了Exception
要麼拋出去給上級調用者,要麼調用異常代碼的時候進行捕捉,有相對應的處理方式!
如果繼承的是RuntimeException,可以不用拋,也可以不用捕捉但是問題是在運行的過程中才會
展現出來!一但出錯,後面程序將無法繼續運行!
*/
2. java都有哪些異常
1. 異常機制
異常機制是指當程序出現錯誤後,程序如何處理。具體來說,異常機制提供了程序退出的安全通道。當出現錯誤後,程序執行的流程發生改變,程序的控制權轉移到異常處理器。
傳統的處理異常的辦法是,函數返回一個特殊的結果來表示出現異常(通常這個特殊結果是大家約定俗稱的),調用該函數的程序負責檢查並分析函數返回的結果。這樣做有如下的弊端:例如函數返回-1代表出現異常,但是如果函數確實要返回-1這個正確的值時就會出現混淆;可讀性降低,將程序代碼與處理異常的代碼混爹在一起;由調用函數的程序來分析錯誤,這就要求客戶程序員對庫函數有很深的了解。
異常處理的流程:
① 遇到錯誤,方法立即結束,並不返回一個值;同時,拋出一個異常對象 。
② 調用該方法的程序也不會繼續執行下去,而是搜索一個可以處理該異常的異常處理器,並執行其中的代碼 。
2 異常的分類
異常的分類:
① 異常的繼承結構:基類為Throwable,Error和Exception繼承Throwable,RuntimeException和IOException等繼承Exception,具體的RuntimeException繼承RuntimeException。
② Error和RuntimeException及其子類成為未檢查異常(unchecked),其它異常成為已檢查異常(checked)。
每個類型的異常的特點
Error體系 :
Error類體系描述了Java運行系統中的內部錯誤以及資源耗盡的情形。應用程序不應該拋出這種類型的對象(一般是由虛擬機拋出)。如果出現這種錯誤,除了盡力使程序安全退出外,在其他方面是無能為力的。所以,在進行程序設計時,應該更關注Exception體系。
Exception體系包括RuntimeException體系和其他非RuntimeException的體系 :
① RuntimeException:RuntimeException體系包括錯誤的類型轉換、數組越界訪問和試圖訪問空指針等等。處理RuntimeException的原則是:如果出現RuntimeException,那麼一定是程序員的錯誤。例如,可以通過檢查數組下標和數組邊界來避免數組越界訪問異常。
②其他非RuntimeException(IOException等等):這類異常一般是外部錯誤,例如試圖從文件尾後讀取數據等,這並不是程序本身的錯誤,而是在應用環境中出現的外部錯誤。
與C++異常分類的不同 :
① Java中RuntimeException這個類名起的並不恰當,因為任何異常都是運行時出現的。(在編譯時出現的錯誤並不是異常,換句話說,異常就是為了解決程序運行時出現的的錯誤)。
② C++中logic_error與Java中的RuntimeException是等價的,而runtime_error與Java中非RuntimeException類型的異常是等價的。
3 異常的使用方法
聲明方法拋出異常
① 語法:throws(略)
② 為什麼要聲明方法拋出異常?
方法是否拋出異常與方法返回值的類型一樣重要。假設方法拋出異常確沒有聲明該方法將拋出異常,那麼客戶程序員可以調用這個方法而且不用編寫處理異常的代碼。那麼,一旦出現異常,那麼這個異常就沒有合適的異常控制器來解決。
③ 為什麼拋出的異常一定是已檢查異常?
RuntimeException與Error可以在任何代碼中產生,它們不需要由程序員顯示的拋出,一旦出現錯誤,那麼相應的異常會被自動拋出。而已檢查異常是由程序員拋出的,這分為兩種情況:客戶程序員調用會拋出異常的庫函數(庫函數的異常由庫程序員拋出);客戶程序員自己使用throw語句拋出異常。遇到Error,程序員一般是無能為力的;遇到RuntimeException,那麼一定是程序存在邏輯錯誤,要對程序進行修改(相當於調試的一種方法);只有已檢查異常才是程序員所關心的,程序應該且僅應該拋出或處理已檢查異常。
注意:覆蓋父類某方法的子類方法不能拋出比父類方法更多的異常,所以,有時設計父類的方法時會聲明拋出異常,但實際的實現方法的代碼卻並不拋出異常,這樣做的目的就是為了方便子類方法覆蓋父類方法時可以拋出異常。
如何拋出異常
① 語法:throw(略)
② 拋出什麼異常?對於一個異常對象,真正有用的信息時異常的對象類型,而異常對象本身毫無意義。比如一個異常對象的類型是ClassCastException,那麼這個類名就是唯一有用的信息。所以,在選擇拋出什麼異常時,最關鍵的就是選擇異常的類名能夠明確說明異常情況的類。
③ 異常對象通常有兩種構造函數:一種是無參數的構造函數;另一種是帶一個字元串的構造函數,這個字元串將作為這個異常對象除了類型名以外的額外說明。
④ 創建自己的異常:當Java內置的異常都不能明確的說明異常情況的時候,需要創建自己的異常。需要注意的是,唯一有用的就是類型名這個信息,所以不要在異常類的設計上花費精力。
捕獲異常
如果一個異常沒有被處理,那麼,對於一個非圖形界面的程序而言,該程序會被中止並輸出異常信息;對於一個圖形界面程序,也會輸出異常的信息,但是程序並不中止,而是返回用錯誤頁面。
語法:try、catch和finally(略),控制器模塊必須緊接在try塊後面。若擲出一個異常,異常控制機制會搜尋參數與異常類型相符的第一個控制器隨後它會進入那個catch 從句,並認為異常已得到控制。一旦catch 從句結束對控制器的搜索也會停止。
捕獲多個異常(注意語法與捕獲的順序)(略)
finally的用法與異常處理流程(略)
異常處理做什麼?對於Java來說,由於有了垃圾收集,所以異常處理並不需要回收內存。但是依然有一些資源需要程序員來收集,比如文件、網路連接和圖片等資源。
應該聲明方法拋出異常還是在方法中捕獲異常?原則:捕捉並處理哪些知道如何處理的異常,而傳遞哪些不知道如何處理的異常。
再次拋出異常
①為什麼要再次拋出異常? 在本級中,只能處理一部分內容,有些處理需要在更高一級的環境中完成,所以應該再次拋出異常。這樣可以使每級的異常處理器處理它能夠處理的異常。
②異常處理流程 :對應與同一try塊的catch塊將被忽略,拋出的異常將進入更高的一級。
4 關於異常的其他問題
① 過度使用異常 :首先,使用異常很方便,所以程序員一般不再願意編寫處理錯誤的代碼,而僅僅是簡簡單單的拋出一個異常。這樣做是不對的,對於完全已知的錯誤,應該編寫處理這種錯誤的代碼,增加程序的魯棒性。另外,異常機制的效率很差。
② 將異常與普通錯誤區分開:對於普通的完全一致的錯誤,應該編寫處理這種錯誤的代碼,增加程序的魯棒性。只有外部的不能確定和預知的運行時錯誤才需要使用異常。
③ 異常對象中包含的信息 :一般情況下,異常對象唯一有用的信息就是類型信息。但使用異常帶字元串的構造函數時,這個字元串還可以作為額外的信息。調用異常對象的getMessage()、toString()或者printStackTrace()方法可以分別得到異常對象的額外信息、類名和調用堆棧的信息。並且後一種包含的信息是前一種的超集。
5 常見異常
算術異常類:ArithmeticExecption
空指針異常類:NullPointerException
類型強制轉換異常:ClassCastException
數組負下標異常:NegativeArrayException
數組下標越界異常:
違背安全原則異常:SecturityException
文件已結束異常:EOFException
文件未找到異常:FileNotFoundException
字元串轉換為數字異常:NumberFormatException
操作資料庫異常:SQLException
輸入輸出異常:IOException
方法未找到異常:NoSuchMethodException
3. java所有的異常類皆繼承哪一個類
個人認為你的答案是錯誤的,因為.java.lang.throwable是java.lang.exception的父類,所以所有的類應該都繼承了throwable個類吧。 你說的異常的類,是只能抽象類了.某子類c,父類p.如果p是普通的類,則c不必重寫p內部的方法.重寫是可選的.如果p抽象類,而c類本身不是抽象類,則必須重寫p所擁有的所有抽象方法,其中包含p實現了的介面的方法.以及p類以上所有父類的抽象方法.
4. java中自定義異常為何要繼承exception類
java.lang.Exception類是Java中所有異常的直接或間接父類。即Exception類是所有異常的根類。
1、異常的分類:
① 非運行時異常(Checked Exception)
② 運行時異常(Runtime Exception/Unchecked Exception)
public class Exception
extends Throwable
Exception 類及其子類是 Throwable 的一種形式,它指出了合理的應用程序想要捕獲的條件。
public class RuntimeException
extends Exception
RuntimeException 是那些可能在 Java 虛擬機正常運行期間拋出的異常的超類。
可能在執行方法期間拋出但未被捕獲的 RuntimeException 的任何子類都無需在 throws 子句中進行聲明。
a) RuntimeException類直接繼承自Exception類,稱為運行時異常。Java中所有的運行時異常都直接或間接的繼承自RuntimeException.
Java中所有的異常類都直接或間接的繼承自Exception。
2、異常的處理:
對應非運行時異常,必須對其進行處理。處理方式有兩種:
使用try…catch…finally語句塊進行捕獲
在產生異常的方法所在的方法聲明throws Exception
對於運行時異常,可以不對其進行處理,也可以對其進行處理。一般情況下都不對其進行處理。
3、捕獲異常:
try {
FileInputStream fs = new FileInputStream("D:/temp/a.txt");
} catch (FileNotFoundException e) {
System.out.println("catch...");
e.printStackTrace();
} finally{
System.out.println("finally...");
}
4、拋出和捕獲異常:
4.1、把異常交給JVM處理:
public class ExceptionTest {
public static void execute() throws Exception {
System.out.println("execute...");
throw new Exception();
}
public static void main(String[] args) throws Exception {
execute();
}
}
4.2、或者使用try catch語句塊捕獲異常:
public class ExceptionTest {
public static void execute() throws Exception {
System.out.println("execute...");
throw new Exception();
}
public static void main(String[] args) {
try {
execute();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
5、自定義異常:
自定義異常通常是定義一個繼承自Exception類的子類。一般情況下我們都會直接繼承自Exception類,而不會繼承某個運行時的異常類。
5.1、創建自定義異常:
public class MyException extends Exception{
public MyException(){
super();
}
public MyException(String msg){
super(msg);
}
}
5.2、在類中使用異常:
public class ExceptionTest {
public static void execute(String a) throws MyException {
System.out.println("execute...");
if("true".equals(a)){
throw new MyException("參數不能為 true");
}
}
}
5.3、捕獲自定義異常:
public static void main(String[] args) throws MyException {
execute("true");
}
6、異常使用注意事項:
當使用多個catch語句塊來捕獲異常時,需要將父類的catch語句塊放到子類型的catch塊之後,這樣才能保證後續的catch可能被執行,否則子類型的catch將永遠無法到達,Java編譯器會報編譯錯誤。
如果try語句塊中存在return語句,那麼首先會執行finally語句塊中的代碼,然後才返回。
如果try語句塊中存在System.exit(0)語句,那麼久不會執行finally語句塊的代碼了,因為System.exit(0)會終止當前運行的JVM。程序在JVM終止前結束執行。
5. java中自定義異常繼承了Exception,下面構造方法都是繼承了Exception嗎,可以
構造方法不存在繼承。因為Exception類共有4個構造方法,而你勾選了eclipse的來自父類的構造方法選項,因此eclipse自動為你生成4個和Exception類的構造方法參數類型相同的構造方法。
6. java 什麼是繼承什麼是異常簡述Java的異常處理機制。
面向對象編程 (OOP) 語言的一個主要功能就是「繼承」。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展。
通過繼承創建的新類稱為「子類」或「派生類」。
被繼承的類稱為「基類」、「父類」或「超類」。
繼承的過程,就是從一般到特殊的過程。
要實現繼承,可以通過「繼承」(Inheritance)和「組合」(Composition)來實現。
在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。
繼承概念的實現方式有三類:實現繼承、介面繼承和可視繼承。
�0�1 實現繼承是指使用基類的屬性和方法而無需額外編碼的能力;
�0�1 介面繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力;
�0�1 可視繼承是指子窗體(類)使用基窗體(類)的外觀和實現代碼的能力。
在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關系應該是「屬於」關系。例如,Employee 是一個人,Manager 也是一個人,因此這兩個類都可以繼承 Person 類。但是 Leg 類卻不能繼承 Person 類,因為腿並不是一個人。
抽象類僅定義將由子類創建的一般屬性和方法,創建抽象類時,請使用關鍵字 Interface 而不是 Class。
OO開發範式大致為:劃分對象→抽象類→將類組織成為層次化結構(繼承和合成) →用類與實例進行設計和實現幾個階段。