【译】NoClassDefFoundError和ClassNotFoundException的不同
本文翻譯自:Difference between NoClassDefFoundError vs ClassNotFoundExcepiton in Java
如果JVM或者ClassLoader在加載類時找不到對應的類,就會引發(fā)NoClassDefFoundError和ClassNotFoundException,這兩種錯誤都非常嚴重。由于不同的ClassLoader會從不同的地方加載類,有時是錯誤的CLASSPATH引發(fā)這類錯誤,有時是某個庫的jar包缺失引發(fā)這類錯誤。NoClassDefFoundError和ClassNotFoundException之間存在一些細微的不同點。
NoClassDefFoundError表示該類在編譯階段還可以找到,但是在運行Java應用的時候找不到了,有時靜態(tài)塊的初始化過程會導致NoClassDefFoundError。
另外一方面,ClassNotFoundException和編譯期沒什么關系,當你在程序運行時利用反射加載類時,就可能遇到ClassNotFoundException異常,例如加載SQL驅動時,對應的類加載器找不到驅動類。除了這些基本的不同,我們可以看看別的不同,以加深對NoClassDefFoundError和ClassNotFoundException的理解。
NoClassDefFoundError vs ClassNotFoundException
簡單來說,NoClassDefFoundError和ClassNotFoundException都是由于在CLASSPATH下找不到對應的類而引起的,通常是缺少對應的jar包,不過,JVM認為:(1)當應用運行時沒有找到對應的引用,則會拋出java.lang.NoClassDefFoundError;(2)當你在代碼中顯式加載類(使用Class.forName())時沒有找到對應的類,則會拋出java.lang.ClassNotFoundException。開發(fā)者經(jīng)常遇到的情況是:ClassNotFoundException異常引起了ClassNoDefFoundError。
NoClassDefFoundError是Error,是unchecked,因此也不需要使用try-catch或者finally語句塊包圍;另外,ClassNotFoundException是受檢異常(checked Exception),因此需要使用try-catch語句塊或者try-finally語句塊包圍,否則會導致編譯錯誤。
如果你在J2EE開發(fā)中遇到NoClassDefFoundError,那么最有可能的原因就是存在多個類加載器和多個目標類,即我們常說的Jar包沖突——關于Jar包沖突,一般可以使用下面兩種方法解決:
- 使用Maven Helper 這個插件,可以排除掉大部分jar包沖突;
- 根據(jù)命令mvn dependency:tree -Dverbose -Dincludes=:logback-classic
調(diào)用Class.forName()、ClassLoader.findSystemClass()和ClassLoader.loadClass()等方法時可能會引起java.lang.ClassNotFoundException
NoClassDefFoundError是鏈接錯誤,發(fā)生在鏈接階段,當解析引用的時候找不到對應的類,就會拋出java.lang.NoClassDefFoundError;ClassNotFoundException是異常,發(fā)生在運行階段。
JVM類加載階段
最后,這里有一頁非常好的PPT,總結了這兩種異常的不同點:
nice slide of all differences between java.lang.NoClassDefFoundError and java.lang.ClassNotFoundException in Java
-
java.lang.ClassNotFoundException與java.lang.NoClassDefFoundError的區(qū)別 - xingoo - 博客園
總結
以上是生活随笔為你收集整理的【译】NoClassDefFoundError和ClassNotFoundException的不同的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codevs3872 邮递员送信(SPF
- 下一篇: I00037 亏数(Deficient