1. java中error和exception的區別
Error類和Exception類的父類都是throwable類,他們的區別是:
Error類一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢等。對於這類錯誤的導致的應用程序中斷,僅靠程序本身無法恢復和和預防,遇到這樣的錯誤,建議讓程序終止。
Exception類表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該盡可能處理異常,使程序恢復運行,而不應該隨意終止異常。
Exception類又分為運行時異常(Runtime Exception)和受檢查的異常(Checked Exception ),運行時異常;ArithmaticException,IllegalArgumentException,編譯能通過,但是一運行就終止了,程序不會處理運行時異常,出現這類異常,程序會終止。而受檢查的異常,要麼用try。。。catch捕獲,要麼用throws字句聲明拋出,交給它的父類處理,否則編譯不會通過。
2. java語言中error和exception有什麼區別final和finally有什麼區別
error通常指錯誤,已經超出了異常的范疇,如:典型的error有內存溢出,這種錯誤你是無法通過通過程序來控制和更正的。而Exception則是指由於程序員的疏忽導致程序在運行時出現了非正常的狀態,這種異常通常時是由於程序員的邏輯問題或者疏忽大意造成的,但是程序員同樣可以通過程序代碼來進行修復和改正。只要程序員認真全面的檢查。程序中的異常可以被避免。兩者的主要區別也就是一個可以由程序來控制修復,而error則很難修復或者不受程序員控制的錯誤。至於final是Java中的訪問修飾符,一個類被聲明為final,則意味著這個類不能被繼承,不能有子類,一個方法被聲明稱final則該方法不能被重寫,一個變數被聲明為final則該變數在運行時無法動態更改變數的值。而finally則是異常處理語句塊的一部分。通常在捕獲異常後會執行該語句塊中的內容(如果有的話)。比如可以在該語句塊中來執行數據連接關閉的操作。說的很清楚了,有不明白的地方再問吧!~
3. 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 原則
希望對您有所幫助!~
4. 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 原則
希望對您有所幫助!~
5. Java運行時異常和非運行時異常
Java 異常機制是基於 Throwable 類,所有異常和錯誤都繼承於此。Java 中的異常被分為兩大類:錯誤 (Error) 和異常 (Exception)。Error 類通常指的是系統級錯誤,如系統崩潰、虛擬機錯誤等,無法被程序捕獲或恢復,應用程序無法處理這些錯誤,因此不需要捕獲 Error 對象。
Exception 類又分為運行時異常 (RuntimeException) 和非運行時異常 (Non-Checked Exception)。RuntimeException 包括諸如 NullPointerException、IndexOutOfBoundsException 等,這些異常通常由程序邏輯錯誤引起。雖然它們是異常,但在程序運行中很容易出現,且通常可預見,因此通常需要程序員進行處理或忽略。非運行時異常則包括檢查異常(如 IOException、SQLException)和錯誤(Error),它們都是 Exception 類及其子類,Java 編譯器要求在程序中必須處理這些異常。
運行時異常都是 RuntimeException 類及其子類的異常,它們不被 Java 編譯器強制要求處理,程序可以選擇捕獲處理,也可以不處理。當程序出現運行時異常,通常由 Java 虛擬機處理,如出現 NullPointerException,我們通常不進行處理。如果不處理運行時異常,程序會繼續執行直到異常導致線程或程序終止。然而,為了避免異常導致程序終止,可以捕獲並處理運行時異常,或者使用 try-catch 塊來處理。
非運行時異常則需要被處理,無論是通過 try-catch 塊中的 catch 子句來捕獲和處理,還是通過 throws 關鍵字在方法聲明中聲明拋出這些異常。這些異常通常與特定的編程操作相關,如文件讀寫、資料庫操作等,因此在進行這些操作時需要預見並處理可能出現的異常。
在 Java 中,使用 finally 關鍵字可以確保某些代碼塊在 try 或 catch 塊執行後總能得到執行,這對於清理資源或確保某些操作始終完成是非常有用的。例如,在一個方法中,try 塊返回一個值,finally 塊執行一些清理操作,無論 try 塊是否執行到 return,finally 塊中的代碼都會執行。
最後,常見的 RuntimeException 包括 ArrayStoreException、ClassCastException、IllegalArgumentException、IndexOutOfBoundsException、NoSuchElementException 和 NullPointerException。這些異常分別對應不同類型的錯誤情況,如嘗試將錯誤類型的對象存儲到數組中、嘗試將一個對象強制轉換為非其實例的子類、向方法傳遞不合法或不正確的參數、數組或序列化操作中的排序索引超出范圍、枚舉中沒有更多元素、程序試圖在需要對象的地方使用 null 等。