轉(zhuǎn)自:https://www.cnblogs.com/duke2016/p/9153241.html
在寫Java程序的時候诉瓦,當(dāng)一個類找不到的時候,JVM有時候會拋出ClassNotFoundException異常危彩,而有時候又會拋出NoClassDefFoundError。看兩個異常的字面意思悔政,好像都是類找不到,但是JVM為什么要用兩個異常去區(qū)分類找不到的情況呢延旧?這個兩個異常有什么不同的地方呢谋国?
ClassNotFoundException
ClassNotFoundException是一個運行時異常。從類繼承層次上來看迁沫,ClassNotFoundException是從Exception繼承的芦瘾,所以ClassNotFoundException是一個檢查異常。
最簡單的二鳄,當(dāng)我們使用JDBC去連接數(shù)據(jù)庫的時候,我們一般會使用Class.forName()的方式去加載JDBC的驅(qū)動沐扳,如果我們沒有將驅(qū)動放到應(yīng)用的classpath下泥从,那么會導(dǎo)致運行時找不到類,所以運行Class.forName()會拋出ClassNotFoundException沪摄。
public class MainClass {
public static void main(String[] args) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
輸出:
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at MainClass.main(MainClass.java:7)
NoClassDefFoundError
NoClassDefFoundError異常躯嫉,看命名后綴是一個Error。從類繼承層次上看杨拐,NoClassDefFoundError是從Error繼承的祈餐。和ClassNotFoundException相比,明顯的一個區(qū)別是哄陶,NoClassDefFoundError并不需要應(yīng)用程序去關(guān)心catch的問題帆阳。
public class TempClass {
}
public class MainClass {
public static void main(String[] args) {
TempClass t = new TempClass();
}
}
首先這里我們先創(chuàng)建一個TempClass敢课,然后編譯以后阶祭,將TempClass生產(chǎn)的TempClass.class文件刪除绷杜,然后執(zhí)行程序,輸出:
Exception in thread "main" java.lang.NoClassDefFoundError: TempClass
at MainClass.main(MainClass.java:6)
Caused by: java.lang.ClassNotFoundException: TempClass
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
總結(jié)一下區(qū)別:
ClassNotFoundException | NoClassDefFoundError |
---|---|
從java.lang.Exception繼承濒募,是一個Exception類型 | 從java.lang.Error繼承鞭盟,是一個Error類型 |
當(dāng)動態(tài)加載Class的時候找不到類會拋出該異常 | 當(dāng)編譯成功以后執(zhí)行過程中Class找不到導(dǎo)致拋出該錯誤 |
一般在執(zhí)行Class.forName()、ClassLoader.loadClass()或ClassLoader.findSystemClass()的時候拋出 | 由JVM的運行時系統(tǒng)拋出 |