如果jvm或者classloader在加載類時找不到對應的類,就會引發noclassdeffounderror和classnotfoundexception,這兩種錯誤都非常嚴重。由于不同的classloader會從不同的地方加載類,有時是錯誤的classpath引發這類錯誤,有時是某個庫的jar包缺失引發這類錯誤。noclassdeffounderror和classnotfoundexception之間存在一些細微的不同點。
noclassdeffounderror表示該類在編譯階段還可以找到,但是在運作java應用的時候找不到了,有時靜态塊的初始化過程會導緻noclassdeffounderror。
另外一方面,classnotfoundexception和編譯期沒什麼關系,當你在程式運作時利用反射加載類時,就可能遇到classnotfoundexception異常,例如加載sql驅動時,對應的類加載器找不到驅動類。除了這些基本的不同,我們可以看看别的不同,以加深對noclassdeffounderror和classnotfoundexception的了解。
簡單來說,noclassdeffounderror和classnotfoundexception都是由于在classpath下找不到對應的類而引起的,通常是缺少對應的jar包,不過,jvm認為:(1)當應用運作時沒有找到對應的引用,則會抛出java.lang.noclassdeffounderror;(2)當你在代碼中顯式加載類(使用class.forname())時沒有找到對應的類,則會抛出java.lang.classnotfoundexception。開發者經常遇到的情況是:classnotfoundexception異常引起了classnodeffounderror。
noclassdeffounderror是error,是unchecked,是以也不需要使用try-catch或者finally語句塊包圍;另外,classnotfoundexception是受檢異常(checked exception),是以需要使用try-catch語句塊或者try-finally語句塊包圍,否則會導緻編譯錯誤。
如果你在j2ee開發中遇到noclassdeffounderror,那麼最有可能的原因就是存在多個類加載器和多個目标類,即我們常說的jar包沖突——關于jar包沖突,一般可以使用下面兩種方法解決:
使用maven helper 這個插件,可以排除掉大部分jar包沖突;
根據指令<code>mvn dependency:tree -dverbose -dincludes=:logback-classic</code>
調用class.forname()、classloader.findsystemclass()和classloader.loadclass()等方法時可能會引起java.lang.classnotfoundexception
noclassdeffounderror是連結錯誤,發生在連結階段,當解析引用的時候找不到對應的類,就會抛出java.lang.noclassdeffounderror;classnotfoundexception是異常,發生在運作階段。
jvm類加載階段
最後,這裡有一頁非常好的ppt,總結了這兩種異常的不同點:
nice slide of all differences between java.lang.noclassdeffounderror and java.lang.classnotfoundexception in java
<a href="http://www.cnblogs.com/xing901022/p/4185514.html"></a>