問題: NoClassDefFoundError和ClassNotFoundException之間有什么區別?是由什么導致的?
NoClassDefFoundError和ClassNotFoundException之前的區別是什么?
是什么導致它們被拋出?這些問題我們要怎么樣解決?
當我在為了引入新的jar包而修改現有代碼的時候,我經常遇到這些異常。在webstart發布的java應用程序的客戶端和服務端,我都遇到過這些異常。
我所遇到的問題可能的原因:
- packages not included in build.xml for the client side of code
- runtime classpath missing for the new jars we are using
- version conflicts with previous jar
如今,當我遇到這些問題時,我會采取trail-and-error 的方法來讓程序正常進行。但是我需要更加清楚的認知和理解。
回答
來自http://www.javaroots.com/2013/02/classnotfoundexception-vs.html:
ClassNotFoundException:當類加載器在class path下面找不到需要的類時發生。所以,基本上你應該檢查你的class path并在class path下面添加類。
NoClassDefFoundError:這更難調試和查找原因。在編譯時需要的類是存在的,但是在運行時類被更改或者刪除,或者類的靜態初始化出現異常,這個異常就會被拋出了。這意味著類加載的時候,該類是存在于classpath中,但是這個類其中所需要的一個類要么被刪除了,要么編譯器加載失敗。所以你應該去看這個類的所依賴的類。
例子:
public class Test1
{
}public class Test
{public static void main(String[] args){Test1 = new Test1(); }}
在編譯完這兩個類以后,刪除test1運行test就會出現異常
Exception in thread "main" java.lang.NoClassDefFoundError: Testat Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Testat java.net.URLClassLoader$1.run(Unknown Source)at java.net.URLClassLoader$1.run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)... 1 more
文章翻譯自Stack Overflow:https://stackoverflow.com/questions/1457863/what-causes-and-what-are-the-differences-between-noclassdeffounderror-and-classn