Ⅰ java自定義異常,應該繼承Exception還是Runtime Exception,為什麼
runtimeException是Exception的一個子類型,自定義異常可以繼承Exception或其子類.
通常調用一下父類的構造方法。
public class MyException extends Exception {
public MyException() { super(); }
public MyException(String msg) { super(msg); }
public MyException(Throwable cause) { super(cause); }
public MyException(String msg, Throwable cause) { super(msg, cause); }
}
public String[] createArray(int length) throws MyException {
if (length < 0) {
throw new MyException("數組長度小於0,不合法");
}
return new String[length];
}
上面這個例子,你繼承RuntimeException也是沒問題的.通常繼承Exception,范圍更大.
Ⅱ java中,我自己創建了一個異常類(直接繼承Exception),throw 之後可以被捕獲但程序卻在繼續運行
因為被捕獲了,所以才會繼續運行。
就相當於 一個公司(一個完整的程序)中的某一個員工(一段代碼)發現了一個錯誤並處理了(顯示出來或者是丟棄了),沒有上報(沒有 throw ),公司還是會正常運行下去的。
try {
a = Motors.choseMotors(x,p.pd);
} catch (Exception e1) {
e1.printStackTrace();
throw e1;//添加上這一句試試
}
//員工上報了 throw ,公司領導知道後發現是個大問題,就會停工檢查
Ⅲ java中error和exception的區別
Error類和Exception類的父類都是throwable類,他們的區別是:
Error類一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢等。對於這類錯誤的導致的應用程序中斷,僅靠程序本身無法恢復和和預防,遇到這樣的錯誤,建議讓程序終止。
Exception類表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該盡可能處理異常,使程序恢復運行,而不應該隨意終止異常。
Exception類又分為運行時異常(Runtime Exception)和受檢查的異常(Checked Exception ),運行時異常;ArithmaticException,IllegalArgumentException,編譯能通過,但是一運行就終止了,程序不會處理運行時異常,出現這類異常,程序會終止。而受檢查的異常,要麼用try。。。catch捕獲,要麼用throws字句聲明拋出,交給它的父類處理,否則編譯不會通過。
Ⅳ java中error和exception有什麼區別
1.如圖Exception 和 Error都繼承自Throwable類,由jdk api文檔中對該類的描述可以知道它是異常處理機制的基本組成類型。可以由虛擬機拋出或者編碼者自行拋出(throw)
jdk8中文發翻譯Throwable類的描述:Throwable類是Java語言中所有錯誤和異常的Throwable類。 只有作為此類(或其一個子類)的實例的對象由Java虛擬機拋出,或者可以由Java throw語句拋出。 類似地,只有這個類或其子類可以是catch子句中的參數類型。
2.Exception 和 Error 體現了 Java 平台設計者對不同異常情況的分類。Exception 是程序正常運行中,可以預料的意外情況,可能並且應該被捕獲,進行相應處理。
3.Error 是指在正常情況下,不大可能出現的情況,絕大部分的 Error 都會導致程序(比如 JVM 自身)處於非正常的、不可恢復狀態。既然是非正常情況,所以不便於也不需要捕獲,常見的比如 OutOfMemoryError 之類,都是 Error 的子類。
4.Exception 又分為可檢查(checked)異常和不檢查(unchecked)異常,可檢查異常在源代碼里必須顯式地進行捕獲處理,這是編譯期檢查的一部分。前面我介紹的不可查的 Error,是 Throwable 不是 Exception。
如何處理這些異常?
在現實編程中我們一般使用 try-with-resources 和 multiple catch來進行一些異常處理(便利的特性),在編譯時期,會自動生成相應的處理邏輯,比如,自動按照約定俗成 close 那些擴展了 AutoCloseable 或者 Closeable 的對象。
try-with-resources 是一種處理Closeable實現類關閉資源的一種寫法,簡單寫了一個例子可以發現其實這就是一中語法,這種語法可以自動編譯幫忙編譯最後關閉流的操作:
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("a"));
BufferedWriter writer = new BufferedWriter(new FileWriter("a"))) {
// Try-with-resources
} catch (IOException e) {// Multiple catch
// Handle it
}
}
編譯後class
public static void main(String[] args) { try {
BufferedReader br = new BufferedReader(new FileReader("a"));
Throwable var2 = null; try {
BufferedWriter writer = new BufferedWriter(new FileWriter("a"));
Object var4 = null; if (writer != null) { if (var4 != null) { try {
writer.close();
} catch (Throwable var15) {
((Throwable)var4).addSuppressed(var15);
}
} else {
writer.close();
}
}
} catch (Throwable var16) {
var2 = var16; throw var16;
} finally { if (br != null) { if (var2 != null) { try {
br.close();
} catch (Throwable var14) {
var2.addSuppressed(var14);
}
} else {
br.close();
}
}
}
} catch (IOException var18) {
;
}
}
異常處理的兩個基本原則
盡量不要捕獲類似 Exception 這樣的通用異常,而是應該捕獲特定異常
這是因為在日常的開發和合作中,我們讀代碼的機會往往超過寫代碼,軟體工程是門協作的藝術,所以我們有義務讓自己的代碼能夠直觀地體現出盡量多的信息,而泛泛的 Exception 之類,恰恰隱藏了我們的目的。另外,我們也要保證程序不會捕獲到我們不希望捕獲的異常。比如,你可能更希望 RuntimeException 被擴散出來,而不是被捕獲。
不要生吞(swallow)異常。這是異常處理中要特別注意的事情,因為很可能會導致非常難以診斷的詭異情況。
如果我們不把異常拋出來,或者也沒有輸出到日誌(Logger)之類,程序可能在後續代碼以不可控的方式結束。沒人能夠輕易判斷究竟是哪裡拋出了異常,以及是什麼原因產生了異常。
在寫程序時可以通過Objects類(jdk提供),或者斷言等提前判斷問題,如空指針異常的一些值的處理Objects. requireNonNull(filename);而不是使用之後有問題再系統拋出異常,這可能就會不直觀的找到問題所在。即:Throw early, catch late 原則
希望對您有所幫助!~
Ⅳ 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終止前結束執行。
Ⅵ java中exception和error有什麼區別
首先從繼承方面來說,Error和Exception都是Throwable的子類。所以從根本上你可以理解他們是差不多的,程序出了問題就拋出。然後一般意義來講,區別就是Error比Exception更嚴重,不易通過後續代碼處理和修復,不應該被代碼catch到的錯誤。而Exception是指嚴重程度較輕的程序問題,相較於Error更容易被後續代碼處理和修復的,有些需要通過try catch代碼處理,有些不建議通過try catch代碼處理。
知識延伸:
Exception分兩種,checked和unchecked。checked Exception就是在寫代碼的時候,IDE(比如Eclipse)會要求你寫try catch的那種Exception,比如IOException。這種Exception是Java的設計者要求你的程序去處理的。這種異常一般不會影響程序的主體,容易手動診斷修復,所以Java要求你在catch下面寫出處理的代碼,以保證程序遇到此類exception之後還可以正常運行。unchecked這一類就是你在代碼處理了checked exception之後,你在運行時候依然會遇到的exception,所以又叫做RunTimeException,比如NullPointerException, IndexOutOfBoundsException。此類exception相較於前面那種更容易影響程序運行,從設計者角度不提倡從程序中catch出來並處理,當然你也可以這么做。
Error就是程序運行時候拋出的最嚴重級別的錯誤了,如VirtualMachineError,ThreadDeath。拋出了Error的程序從Java設計的角度來講,程序基本不可以通過後續代碼修復,從而理應終止。當然,從語法上來講,所有這些都可以被寫進catch裡面,但是Error因為上述原因,不應該被代碼處理。
Ⅶ java所有的異常類皆繼承哪一個類
個人認為你的答案是錯誤的,因為.java.lang.throwable是java.lang.exception的父類,所以所有的類應該都繼承了throwable個類吧。你說的異常的類,是只能抽象類了.某子類c,父類p.如果p是普通的類,則c不必重寫p內部的方法.重寫是可選的.如果p抽象類
Ⅷ java A繼承了Exception 為什麼不能寫throws A
classAextendsException{
intage=-100;
voidf()throwsA//A繼承了Exception為什麼不能寫throwsA
{
if(age<0){
Aa=newA();
throwa;
}
}
}