2017-05-09 105 views
0

在學習異常時,我嘗試了以下步驟,發現了一個非常奇怪的行爲。請找到以下步驟。NoClassDefFoundError-非常奇怪behaiour

  • 創建一個公共類A
  • 運行A

上述步驟程序後做之前B

  • 編譯AB
  • 刪除類B創建一個類運行絕對罰款和拋出NoClassDefFoundError,現在奇怪的是當我宣佈try塊內的參考變量,並再次運行程序,它拋出一個未捕獲NoClassDefFoundError

    public class A{ 
        public static void main(String[] args) { 
          B m ;//Caught is getting printed if declare above try-catch() 
         try { 
          B m = new B();//Here Uncaught exception is throws 
         } catch (java.lang.NoClassDefFoundError ex) { 
          System.out.println("Caught!"); 
         } 
        } 
    } 
    
    class B{ 
    
    } 
    

    我真的沒有爲什麼發生這種情況,請任何想法幫助我理解這個

  • +0

    請同時添加堆棧跟蹤 – Jens

    +0

    http://stackoverflow.com/questions/34413/why-am-i-getting-a-noclassdeffounderror-in-java –

    +0

    只要聲明對「B」的引用不應拋出異常 – TheLostMind

    回答

    2

    B編譯並生成字節碼後,您正在刪除A的類文件。因此,B的代碼仍然引用A,並且當您的A開始運行時,JVM將在創建對象時嘗試加載並初始化B,並且因爲它無法在A的類路徑中找到該類,它會引發NoClassDefinitionFoundException。

    在您的第一個案例中,您只需聲明對B的引用,JVM將不會嘗試加載您的類,除非它真的需要它,所以您不會得到任何異常。