欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中NoClassDefFoundError?和?ClassNotFoundException的區(qū)別

 更新時間:2022年06月14日 09:32:06   作者:共飲一杯無  
Java中NoClassDefFoundError和ClassNotFoundException的區(qū)別,從類繼承層次上來看,ClassNotFoundException是從Exception繼承的,所以ClassNotFoundException是一個檢查異常。具體詳情需要的朋友可以參考下面文章內(nèi)容

前言:

從類繼承層次上來看,ClassNotFoundException是從Exception繼承的,所以ClassNotFoundException是一個檢查異常。NoClassDefFoundError是從Error繼承的。和ClassNotFoundException相比,明顯的一個區(qū)別是,NoClassDefFoundError并不需要應(yīng)用程序去關(guān)心catch的問題。

NoClassDefFoundError

當(dāng)JVM在加載一個類的時候,如果這個類在編譯時是可用的,但是在運行時找不到這個類的定義的時候,JVM就會拋出一個NoClassDefFoundError錯誤。比如當(dāng)我們在new一個類的實例的時候,如果在運行時類找不到,則會拋出一個NoClassDefFoundError的錯誤。通常發(fā)生在執(zhí)行動態(tài)代碼塊或者初始化靜態(tài)字段時報了異常,從而導(dǎo)致類初始化失敗而引發(fā)NoClassDefFoundError。

案例如下:

public class ClassWithInitErrors {
    static int data = 1 / 0;
}

public class NoClassDefFoundErrorTest {
    public ClassWithInitErrors getClassWithInitErrors() {
        ClassWithInitErrors test = new ClassWithInitErrors();
        return test;
    }

    @Test(expected = NoClassDefFoundError.class)
    public void givenInitErrorInClass_whenloadClass_thenNoClassDefFoundError() {
        NoClassDefFoundErrorTest sample
                = new NoClassDefFoundErrorTest();
        sample.getClassWithInitErrors();
    }
}

執(zhí)行程序后會出現(xiàn)如下錯誤:

java.lang.Exception: Unexpected exception, expected<java.lang.NoClassDefFoundError> but was<java.lang.ExceptionInInitializerError>

    at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:28)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    ...  more
Caused by: java.lang.ArithmeticException: / by zero
    at com.zjq.dailyrecord.throwable.ClassWithInitErrors.<clinit>(ClassWithInitErrors.java:4)
    ... 25 more

ClassNotFoundException

當(dāng)應(yīng)用程序運行的過程中嘗試使用類加載器去加載Class文件的時候,如果沒有在classpath中查找到指定的類,就會拋出ClassNotFoundException。一般情況下,當(dāng)我們使用Class.forName()或者ClassLoader.loadClass以及使用ClassLoader.findSystemClass()在運行時加載類的時候,如果類沒有被找到,那么就會導(dǎo)致JVM拋出ClassNotFoundException。
最簡單的,當(dāng)我們使用JDBC去連接數(shù)據(jù)庫的時候,我們一般會使用Class.forName()的方式去加載JDBC的驅(qū)動,如果我們沒有將驅(qū)動放到應(yīng)用的classpath下,那么會導(dǎo)致運行時找不到類,所以運行Class.forName()會拋出ClassNotFoundException。

案例如下:

public class ClassNotFoundExceptionTest {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

執(zhí)行后輸出:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver     at java.net.URLClassLoader.findClass(URLClassLoader.java:381)     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)     at java.lang.Class.forName0(Native Method)     at java.lang.Class.forName(Class.java:264)     at com.zjq.dailyrecord.throwable.ClassNotFoundExceptionTest.main(ClassNotFoundExceptionTest.java:6)

總結(jié)區(qū)別:

解決辦法

他們的主要原因是運行時類路徑中類文件不可用。

下面是幾點具體的原因:

  • 排查所需的jar包是否在類路徑中,如果沒有就添加進(jìn)去。
  • 如果發(fā)現(xiàn)類在classpath里面,很有可能是classpath被重寫了,需要再次確定應(yīng)用準(zhǔn)確的classpath
  • 依賴包發(fā)生了沖突,比如應(yīng)該依賴高版本jar包,但又其它包傳遞依賴了低版本jar包,導(dǎo)致高版本中某些類找不到。
  • 如果應(yīng)用中用到了多個類加載器,一個類加載器加載的類,無法再其他的類加載器中使用。

到此這篇關(guān)于Java中NoClassDefFoundError 和 ClassNotFoundException的區(qū)別的文章就介紹到這了,更多相關(guān)Java NoClassDefFoundError 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入淺析springsecurity入門登錄授權(quán)

    深入淺析springsecurity入門登錄授權(quán)

    SpringSecurity為我們提供了基于注解的權(quán)限控制方案,這也是我們項目中主要采用的方式,我們可以使用注解去指定訪問對應(yīng)的資源所需的權(quán)限,這篇文章主要介紹了springsecurity入門登錄授權(quán),需要的朋友可以參考下
    2024-05-05
  • Kotlin 內(nèi)聯(lián)函數(shù)詳解及實例

    Kotlin 內(nèi)聯(lián)函數(shù)詳解及實例

    這篇文章主要介紹了Kotlin 內(nèi)聯(lián)函數(shù)詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java原生操作JDBC連接以及原理詳解

    Java原生操作JDBC連接以及原理詳解

    這篇文章主要給大家介紹了關(guān)于Java原生操作JDBC連接以及原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java INPUTSTREAM如何實現(xiàn)重復(fù)使用

    Java INPUTSTREAM如何實現(xiàn)重復(fù)使用

    這篇文章主要介紹了Java INPUTSTREAM如何實現(xiàn)重復(fù)使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot無法識別bootstrap.yml小綠葉問題的解決辦法

    SpringBoot無法識別bootstrap.yml小綠葉問題的解決辦法

    一般單獨使用?Spring?Boot?時,bootstrap.yml?文件一般是不會生效的,也就是沒有小綠葉圖標(biāo),本文給大家介紹了SpringBoot無法識別bootstrap.yml小綠葉問題的解決辦法,文中給出了兩種解決方案,需要的朋友可以參考下
    2024-07-07
  • java的基本數(shù)據(jù)類型及屬性

    java的基本數(shù)據(jù)類型及屬性

    java的基本數(shù)據(jù)類型及屬性,需要的朋友可以可以參考一下
    2013-03-03
  • springboot Actuator的指標(biāo)監(jiān)控可視化功能詳解

    springboot Actuator的指標(biāo)監(jiān)控可視化功能詳解

    SpringBoot Actuator是springboot為簡化我們對微服務(wù)項目的監(jiān)控功能抽取出來的模塊,使得我們每個微服務(wù)快速引用即可獲得生產(chǎn)界別的應(yīng)用監(jiān)控、審計等功能。這篇文章主要介紹了springboot Actuator的指標(biāo)監(jiān)控可視化,需要的朋友可以參考下
    2021-08-08
  • Spring MVC數(shù)據(jù)處理和亂碼問題詳解

    Spring MVC數(shù)據(jù)處理和亂碼問題詳解

    這篇文章主要給大家介紹了關(guān)于Spring MVC數(shù)據(jù)處理和亂碼問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 如何使用Spring?Boot設(shè)置上傳文件大小限制

    如何使用Spring?Boot設(shè)置上傳文件大小限制

    上傳文件是互聯(lián)網(wǎng)中常應(yīng)用的場景之一,最典型的情況就是上傳頭像等,下面這篇文章主要給大家介紹了關(guān)于如何使用Spring?Boot設(shè)置上傳文件大小限制的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Java實現(xiàn)int、long、Integer、Long之間的相互轉(zhuǎn)換

    Java實現(xiàn)int、long、Integer、Long之間的相互轉(zhuǎn)換

    本文主要介紹了Java實現(xiàn)int、long、Integer、Long之間的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08

最新評論