NoClassDefFoundError和ClassNotFoundException的區(qū)別是什么

今天就跟大家聊聊有關NoClassDefFoundError 和 ClassNotFoundException 的區(qū)別是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網綜合服務,包含不限于成都網站制作、成都網站建設、呼和浩特網絡推廣、重慶小程序開發(fā)、呼和浩特網絡營銷、呼和浩特企業(yè)策劃、呼和浩特品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學生創(chuàng)業(yè)者提供呼和浩特建站搭建服務,24小時服務熱線:18980820575,官方網址:bm7419.com

NoClassDefFoundError 和 ClassNotFoundException 區(qū)別的常見回答

NoClassDefFoundError 是一種 Error,Error 在大多數(shù)情況下代表無法從程序中恢復的致命錯誤,產生的原因在于 JVM 或者 ClassLoader 在運行時類加載器在 classpath 下找不到需要的類定義(編譯期是可以正常找到的,所以和 ClassNotFoundException 不同的是這是一個運行期的 Error),這個時候虛擬機就會拋出 NoClassDefFoundError,通常造成該 ERROR 的原因是打包過程中漏掉了部分類,或者 jar 包出現(xiàn)損壞或篡改,對應的 Class 在 classpath 中不可用等等原因

ClassNotFoundException 是屬于 Exception 的運行時異常,大多是可以從代碼中恢復的異常類型,導致該異常的原因大多是因為使用 Class.forName() 方法動態(tài)的加載類信息,但是這個類在類路徑中并沒有被找到,那么就會在運行時拋出 ClassNotFoundException

以上是大致的 NoClassDefFoundError 和 ClassNotFoundException 的區(qū)別,那么延伸一下可以探討 Java 類型體系中的 Error 和 Exception


Error 和 Exception 的區(qū)別

Error 和 Exception 都是繼承 Throwable 類,它們體現(xiàn) Java 設計者在對異常的不同情況所進行的分類處理,在 Java 中只有 Throwable 類的實例才能被 try/catch 捕獲或者聲明拋出。

Error 在大多數(shù)情況下代表程序出現(xiàn)了致命并且不可恢復的錯誤,它們大多都是不可預測的錯誤,不需要也不能捕獲和拋出,例如常見的 OutOfMemeryError,StackOverFlowError,還有本文提到的 NoClassDefFoundError,他們都是 Error 的子類

Exception 屬于程序錯誤,大多是人為編碼所導致的,它們大多都可以預測,也可以通過程序處理讓程序正常流程,所以是需要進行捕獲(try/catch)或者聲明拋出(throw)的,Exception 還分兩種情況,可檢查異常 checked exception(編譯期異常),非檢查異常 unchecked exception(運行期異常)

可檢查異常是編譯期必須要顯示處理的異常,編譯器會強制要求處理這種的異常,不然編譯就不會通過,非檢查異常是程序在運行時出現(xiàn)的異常,大多是程序員處理不到導致的程序問題,例如常見的 NullPointerException,ArrayIndexOutOfBoundsException,本文標題的 ClassNotFoundException 就是屬于編譯期異常,在使用 Class.forName 需要強制處理

一圖勝千言,為了方便大家直觀感受,我大概畫了一個簡單的異常體系結構圖,僅供參考:

NoClassDefFoundError 和 ClassNotFoundException 的區(qū)別是什么


使用異常的注意事項

平時在操作異常的時候有什么需要注意的嗎?我們先看一段簡單的代碼示例

try {
		// 業(yè)務代碼
		// something happened
		Thread.sleep(100);
} catch (Exception e) {
	
}

// 業(yè)務代碼

以上代碼犯了哪幾個明顯的錯誤?我簡單列舉一下:

  1. 捕獲異常應該使用特定的類型的 Exception

  2. 沒有對異常進行任何處理

為什么要捕獲特定類型的異常 ?主要有以下幾點 因為你的代碼會被團隊很多人閱讀,寬泛的使用 Exception 對所有異常進行處理會讓別人不好理解你代碼的異常,程序的主要目的也是要體現(xiàn)它的語義,例如 Thread.sleep 是明確拋出 InterruptedException,Class.forName 明確拋出 ClassNotFoundException,那么應該針對 InterruptedException,ClassNotFoundException 這種明確的異常進行明確的處理,而不是泛泛的使用 Exception 包住所有的異常

沒有對異常進行任何處理 這個問題其實比上面更嚴重,這種行為本質上是在掩蓋問題,不僅會導致出現(xiàn)各種詭異的問題,而且完全沒有線索可以跟蹤,沒有人可以猜測到程序是在哪里出了問題,導致定位問題非常低效,所以如果沒有拋出異常,最起碼也要把對應的的錯誤信息 到日志內,而不是“生吞”異常,人為的為診斷設置障礙


總結

我們通過一個簡單的 NoClassDefFoundError 和 ClassNotFoundException 區(qū)別 的問題和一個簡單的異常處理程序 demo 牽引出 Java 的異常體系和不同的分類和平時對異常處理的注意事項

另外推薦大家在實踐中盡量使用統(tǒng)一異常處理的機制,例如 Spring 提供了幾種的全局異常處理機制:

  • 實現(xiàn) HandlerExceptionResolver 接口

  • 在Controller內部,用 @ExceptionHandler 注解處理異常

  • 全局 Controller 異常處理注解 @ControllerAdvice ,可以根據類型處理特定異常

看完上述內容,你們對NoClassDefFoundError 和 ClassNotFoundException 的區(qū)別是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

網站欄目:NoClassDefFoundError和ClassNotFoundException的區(qū)別是什么
分享地址:http://bm7419.com/article10/pcghdo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站營銷、虛擬主機、網站導航、搜索引擎優(yōu)化、云服務器、App設計

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司