java出现errors是什么错误_java中错误(error)和异常(exception)有什么主要区别?
jdk8中文發(fā)翻譯Throwable類的描述:Throwable類是Java語言中所有錯(cuò)誤和異常的Throwable類。 只有作為此類(或其一個(gè)子類)的實(shí)例的對象由Java虛擬機(jī)拋出,或者可以由Java throw語句拋出。 類似地,只有這個(gè)類或其子類可以是catch子句中的參數(shù)類型。
2.Exception 和 Error 體現(xiàn)了 Java 平臺(tái)設(shè)計(jì)者對不同異常情況的分類。Exception 是程序正常運(yùn)行中,可以預(yù)料的意外情況,可能并且應(yīng)該被捕獲,進(jìn)行相應(yīng)處理。
3.Error 是指在正常情況下,不大可能出現(xiàn)的情況,絕大部分的 Error 都會(huì)導(dǎo)致程序(比如 JVM 自身)處于非正常的、不可恢復(fù)狀態(tài)。既然是非正常情況,所以不便于也不需要捕獲,常見的比如 OutOfMemoryError 之類,都是 Error 的子類。
4.Exception 又分為可檢查(checked)異常和不檢查(unchecked)異常,可檢查異常在源代碼里必須顯式地進(jìn)行捕獲處理,這是編譯期檢查的一部分。前面我介紹的不可查的 Error,是 Throwable 不是 Exception。
如何處理這些異常?
在現(xiàn)實(shí)編程中我們一般使用 try-with-resources 和 multiple catch來進(jìn)行一些異常處理(便利的特性),在編譯時(shí)期,會(huì)自動(dòng)生成相應(yīng)的處理邏輯,比如,自動(dòng)按照約定俗成 close 那些擴(kuò)展了 AutoCloseable 或者 Closeable 的對象。
try-with-resources 是一種處理Closeable實(shí)現(xiàn)類關(guān)閉資源的一種寫法,簡單寫了一個(gè)例子可以發(fā)現(xiàn)其實(shí)這就是一中語法,這種語法可以自動(dòng)編譯幫忙編譯最后關(guān)閉流的操作:
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) {
;
}
}
異常處理的兩個(gè)基本原則
盡量不要捕獲類似 Exception 這樣的通用異常,而是應(yīng)該捕獲特定異常
這是因?yàn)樵谌粘5拈_發(fā)和合作中,我們讀代碼的機(jī)會(huì)往往超過寫代碼,軟件工程是門協(xié)作的藝術(shù),所以我們有義務(wù)讓自己的代碼能夠直觀地體現(xiàn)出盡量多的信息,而泛泛的 Exception 之類,恰恰隱藏了我們的目的。另外,我們也要保證程序不會(huì)捕獲到我們不希望捕獲的異常。比如,你可能更希望 RuntimeException 被擴(kuò)散出來,而不是被捕獲。
不要生吞(swallow)異常。這是異常處理中要特別注意的事情,因?yàn)楹芸赡軙?huì)導(dǎo)致非常難以診斷的詭異情況。
如果我們不把異常拋出來,或者也沒有輸出到日志(Logger)之類,程序可能在后續(xù)代碼以不可控的方式結(jié)束。沒人能夠輕易判斷究竟是哪里拋出了異常,以及是什么原因產(chǎn)生了異常。
在寫程序時(shí)可以通過Objects類(jdk提供),或者斷言等提前判斷問題,如空指針異常的一些值的處理Objects. requireNonNull(filename);而不是使用之后有問題再系統(tǒng)拋出異常,這可能就會(huì)不直觀的找到問題所在。即:Throw early, catch late 原則
希望對您有所幫助!~
總結(jié)
以上是生活随笔為你收集整理的java出现errors是什么错误_java中错误(error)和异常(exception)有什么主要区别?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rust go java 性能_Java
- 下一篇: java 投票算法_Boyer and