ClassNotFoundException和NoClassDefFoundError的區別

正如它們的名字所說明的:NoClassDefFoundError是一個錯誤(Error),而ClassNOtFoundException是一個異常,在Java中錯誤和異常是有區別的,咱們能夠從異常中恢復程序但卻不該該嘗試從錯誤中恢復程序。html

ClassNotFoundException的產生緣由:java

Java支持使用Class.forName方法來動態地加載類,任意一個類的類名若是被做爲參數傳遞給這個方法都將致使該類被加載到JVM內存中,若是這個類在類路徑中沒有被找到,那麼此時就會在運行時拋出ClassNotFoundException異常web

要解決這個問題很容易,惟一須要作的就是要確保所需的類連同它依賴的包存在於類路徑中。當Class.forName被調用的時候,類加載器會查找類路徑中的類,若是找到了那麼這個類就會被成功加載,若是沒找到,那麼就會拋出ClassNotFountException,除了Class.forName,ClassLoader.loadClass、ClassLOader.findSystemClass在動態加載類到內存中的時候也可能會拋出這個異常。ide

另外還有一個致使ClassNotFoundException的緣由就是:當一個類已經某個類加載器加載到內存中了,此時另外一個類加載器又嘗試着動態地從同一個包中加載這個類。idea

因爲類的動態加載在某種程度上是被開發者所控制的,因此他能夠選擇catch這個異常而後採起相應的補救措施。有些程序可能但願忽略這個異常而採起其餘方法。還有一些程序則會終止程序而後讓用戶再次嘗試前作點事情。spa

NoClassDefFoundError產生的緣由:.net

若是JVM或者ClassLoader實例嘗試加載(能夠經過正常的方法調用,也多是使用new來建立新的對象)類的時候卻找不到類的定義。要查找的類在編譯的時候是存在的,運行的時候卻找不到了。這個錯誤每每是你使用new操做符來建立一個新的對象但卻找不到該對象對應的類。這個時候就會致使NoClassDefFoundError.htm

因爲NoClassDefFoundError是有JVM引發的,因此不該該嘗試捕捉這個錯誤。對象

解決這個問題的辦法就是:查找那些在開發期間存在於類路徑下但在運行期間卻不在類路徑下的類blog

另:

ClassNotFoundException發生在裝入階段。 
當應用程序試圖經過類的字符串名稱,使用常規的三種方法裝入類,但卻找不到指定名稱的類定義時就拋出該異常。

NoClassDefFoundError: 當目前執行的類已經編譯,可是找不到它的定義時

也就是說你若是編譯了一個類B,在類A中調用,編譯完成之後,你又刪除掉B,運行A的時候那麼就會出現這個錯誤

加載時從外存儲器找不到須要的class就出現ClassNotFoundException 
鏈接時從內存找不到須要的class就出現NoClassDefFoundError

另:


NoClassDefFoundError 解決的三種方法:

1. Simple example of NoClassDefFoundError is class belongs to a jar and jar was not added into classpath or sometime jar’s name has been changed by someone like in my case one of my colleague has changed tibco.jar into tibco_v3.jar and by program is failing with java.lang.NoClassDefFoundError and I was wondering what’s wrong.

首先是類在運行的時候依賴於其它的一個jar包,可是該jar包沒有加載到classpath中或者是該jar包的名字被其餘人改了,就像個人一個例子tibo.jar改成了tibco_v3.jar…….

2. Class is not in Classpath, there is no sure shot way of knowing it but many a times you can just have a look to print System.getproperty(」java.classpath「)and it will print the classpath from there you can at least get an idea of your actual runtime classpath.

運行的類不在classpath中,這個問題沒有一個肯定的方法去知道,可是不少時候你能夠經過System.getproperty(」java.classpath「)方法,該方法能讓你至少能夠領略到實際存在的運行期間的classpath。

 
3. Just try to run with explicitly -classpath option with the classpath you think will work and if its working then it’s sure short sign that some one is overriding java classpath.

試着經過-classpath命令明確指出你認爲正確的classpath,若是可以正常執行的話就說明你使用的classpath是正確的,而系統中的classpath已經被修該過了。


參考資料:http://www.javaexperience.com/classnotfoundexception-vs-noclassdeffounderror-in-java/

http://blog.csdn.net/joe_007/article/details/6711782

http://scnblogs.techweb.com.cn/ericxl/archives/51.html

相關文章
相關標籤/搜索