javaerror
Ⅰ java中錯誤(error)和異常(exception)有什麼主要區別
1.如圖Exception 和 Error都繼承自Throwable類,由jdk api文檔中對該類的描述可以知道它是異常處理機制的基本組成類型。可以由虛擬機拋出或者編碼者自行拋出(throw)
jdk8中文發翻譯Throwable類的描述:Throwable類是Java語言中所有錯誤和異常的Throwable類。 只有作為此類(或其一個子類)的實例的對象由Java虛擬機拋出,或者可以由Java throw語句拋出。 類似地,只有這個類或其子類可以是catch子句中的參數類型。
在現實編程中我們一般使用 try-with-resources 和 multiple catch來進行一些異常處理(便利的特性),在編譯時期,會自動生成相應的處理邏輯,比如,自動按照約定俗成 close 那些擴展了 AutoCloseable 或者 Closeable 的對象。
try-with-resources 是一種處理Closeable實現類關閉資源的一種寫法,簡單寫了一個例子可以發現其實這就是一中語法,這種語法可以自動編譯幫忙編譯最後關閉流的操作:
盡量不要捕獲類似 Exception 這樣的通用異常,而是應該捕獲特定異常
這是因為在日常的開發和合作中,我們讀代碼的機會往往超過寫代碼,軟體工程是門協作的藝術,所以我們有義務讓自己的代碼能夠直觀地體現出盡量多的信息,而泛泛的 Exception 之類,恰恰隱藏了我們的目的。另外,我們也要保證程序不會捕獲到我們不希望捕獲的異常。比如,你可能更希望 RuntimeException 被擴散出來,而不是被捕獲。
不要生吞(swallow)異常。這是異常處理中要特別注意的事情,因為很可能會導致非常難以診斷的詭異情況。
如果我們不把異常拋出來,或者也沒有輸出到日誌(Logger)之類,程序可能在後續代碼以不可控的方式結束。沒人能夠輕易判斷究竟是哪裡拋出了異常,以及是什麼原因產生了異常。
在寫程序時可以通過Objects類(jdk提供),或者斷言等提前判斷問題,如空指針異常的一些值的處理Objects. requireNonNull(filename);而不是使用之後有問題再系統拋出異常,這可能就會不直觀的找到問題所在。即:Throw early, catch late 原則
2.Exception 和 Error 體現了 Java 平台設計者對不同異常情況的分類。Exception 是程序正常運行中,可以預料的意外情況,可能並且應該被捕獲,進行相應處理。
3.Error 是指在正常情況下,不大可能出現的情況,絕大部分的 Error 都會導致程序(比如 JVM 自身)處於非正常的、不可恢復狀態。既然是非正常情況,所以不便於也不需要捕獲,常見的比如 OutOfMemoryError 之類,都是 Error 的子類。
4.Exception 又分為可檢查(checked)異常和不檢查(unchecked)異常,可檢查異常在源代碼里必須顯式地進行捕獲處理,這是編譯期檢查的一部分。前面我介紹的不可查的 Error,是 Throwable 不是 Exception。
如何處理這些異常?
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) {
;
}
}
異常處理的兩個基本原則
希望對您有所幫助!~
Ⅱ java監聽文件Error listenerStart錯誤
最近項目中採用開啟java線程來監聽文件目錄 在本地測試正常啟動 但是當採用maven中的mvn tomcat:deploy部署到tomcat中時就報如下錯誤
嚴重: Error listenerStart : : re StandardContext start 嚴重: Context [/cms] startup failed e to previous errors
: : DEBUG (cms templet TempletController: ) – >>>>監聽停止了!! : : re StandardContext listenerStop 嚴重: Exception sending context destroyed event to listener instance of class ut il tools ThemePicFileListenerTools java lang NullPointerException陪搏蘆答祥 at util tools ThemePicFntextDestroyed(ThemePicFileLis tenerTools java: ) at re StandardContext listenerStop(StandardContext java: ) at re StandardContext stop(StandardContext java: ) at re StandardContext start(StandardContext java: ) at re ContainerBase start(ContainerBase java: )
at re StandardHost start(StandardHost java: ) at re ContainerBase start(ContainerBase java: )
at re StandardEngine start(StandardEngine java: ) at apache catalina startup Embedded start(Embedded java: ) at dehaus mojo tomcat AbstractRunMojo startContainer(AbstractRunMo jo java: )舉物 at dehaus mojo tomcat AbstractRunMojo execute(AbstractRunMojo java : ) at apache maven plugin DefaultPluginManager executeMojo(DefaultPlugi nManager java: ) at apache maven lifecycle DefaultLifecycleExecutor executeGoals(Defa ultLifecycleExecutor java: ) at apache maven lifecycle DefaultLifecycleExecutor executeStandalone Goal(DefaultLifecycleExecutor java: ) at apache maven lifecycle DefaultLifecycleExecutor executeGoal(Defau ltLifecycleExecutor java: ) at apache maven lifecycle DefaultLifecycleExecutor executeGoalAndHan dleFailures(DefaultLifecycleExecutor java: ) at apache maven lifecycle DefaultLifecycleExecutor executeTaskSegmen ts(DefaultLifecycleExecutor java: ) at apache maven lifecycle DefaultLifecycleExecutor execute(DefaultLi fecycleExecutor java: ) at apache maven DefaultMaven doExecute(DefaultMaven java: ) at apache maven DefaultMaven execute(DefaultMaven java: ) at apache maven cli MavenCli main(MavenCli java: ) at sun reflect NativeMethodAccessorImpl invoke (Native Method) at sun reflect NativeMethodAccessorImpl invoke(NativeMethodAccessorImpl java: ) at sun reflect DelegatingMethodAccessorImpl invoke(DelegatingMethodAcces sorImpl java: ) at java lang reflect Method invoke(Method java: ) at dehaus classworlds Launcher launchEnhanced(Launcher java: ) at dehaus classworlds Launcher launch(Launcher java: ) at dehaus classworlds Launcher mainWithExitCode(Launcher java: )
at dehaus classworlds Launcher main(Launcher java: )
這個錯誤讓我郁悶了好久 最後找到錯誤原因 是因為監聽的文件夾下面沒有內容 maven在發布項目的時候侯就不創建此文件夾 當程序啟動的時候 找不到此目錄 此時監聽就會停止 報以上錯誤
lishixin/Article/program/Java/hx/201311/26397
Ⅲ java中錯誤(error)和異常(exception)有什麼主要區別
Error(錯誤)表示系統級的錯誤和程序不必處理的異常,一般是指與虛擬機相關的問題,是java運行環境中的內部悔碼猛錯誤或者硬體問題。比如:內存資源不足等。對於這種錯誤,程序基本無能為力,除了退出運行外別無選擇,它是由Java虛擬碧橋機拋出的。x0dx0ax0dx0aException(違例)表示需要捕捉或者需要程序進行處理的異常,它處理的是因為程模物序設計的瑕疵而引起的問題或者在外的輸入等引起的一般性問題,是程序必須處理的。x0dx0aException又分為運行時異常,受檢查異常。x0dx0a運行時異常,表示無法讓程序恢復的異常,導致的原因通常是因為執行了錯誤的操作,建議終止程序,因此,編譯器不檢查這些異常。x0dx0a受檢查異常,是表示程序可以處理的異常,也即表示程序可以修復(由程序自己接受異常並且做出處理),所以稱之為受檢查異常。