溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

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

發(fā)布時(shí)間:2021-06-18 15:36:38 來(lái)源:億速云 閱讀:371 作者:Leah 欄目:大數(shù)據(jù)

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

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

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

ClassNotFoundException 是屬于 Exception 的運(yùn)行時(shí)異常,大多是可以從代碼中恢復(fù)的異常類(lèi)型,導(dǎo)致該異常的原因大多是因?yàn)槭褂?Class.forName() 方法動(dòng)態(tài)的加載類(lèi)信息,但是這個(gè)類(lèi)在類(lèi)路徑中并沒(méi)有被找到,那么就會(huì)在運(yùn)行時(shí)拋出 ClassNotFoundException

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


Error 和 Exception 的區(qū)別

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

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

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

可檢查異常是編譯期必須要顯示處理的異常,編譯器會(huì)強(qiáng)制要求處理這種的異常,不然編譯就不會(huì)通過(guò),非檢查異常是程序在運(yùn)行時(shí)出現(xiàn)的異常,大多是程序員處理不到導(dǎo)致的程序問(wèn)題,例如常見(jiàn)的 NullPointerException,ArrayIndexOutOfBoundsException,本文標(biāo)題的 ClassNotFoundException 就是屬于編譯期異常,在使用 Class.forName 需要強(qiáng)制處理

一圖勝千言,為了方便大家直觀感受,我大概畫(huà)了一個(gè)簡(jiǎn)單的異常體系結(jié)構(gòu)圖,僅供參考:

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


使用異常的注意事項(xiàng)

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

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

// 業(yè)務(wù)代碼

以上代碼犯了哪幾個(gè)明顯的錯(cuò)誤?我簡(jiǎn)單列舉一下:

  1. 捕獲異常應(yīng)該使用特定的類(lèi)型的 Exception

  2. 沒(méi)有對(duì)異常進(jìn)行任何處理

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

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


總結(jié)

我們通過(guò)一個(gè)簡(jiǎn)單的 NoClassDefFoundError 和 ClassNotFoundException 區(qū)別 的問(wèn)題和一個(gè)簡(jiǎn)單的異常處理程序 demo 牽引出 Java 的異常體系和不同的分類(lèi)和平時(shí)對(duì)異常處理的注意事項(xiàng)

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

  • 實(shí)現(xiàn) HandlerExceptionResolver 接口

  • 在Controller內(nèi)部,用 @ExceptionHandler 注解處理異常

  • 全局 Controller 異常處理注解 @ControllerAdvice ,可以根據(jù)類(lèi)型處理特定異常

看完上述內(nèi)容,你們對(duì)NoClassDefFoundError 和 ClassNotFoundException 的區(qū)別是什么有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI