2012-03-02 133 views
1

dnsjava圖書館工作,我遇到一個令人沮喪和混亂的問題,我可以正確地調用Type.A但調用Type.value(str)拋出一個java.lang.NoClassDefFoundErrorjava.lang.NoClassDefFoundError拋出靜態方法而不是靜態成員

System.out.println(org.xbill.DNS.Type.A); // works 

if (org.xbill.DNS.Type.value(type) == -1) { // throws NoClassDefFoundError 
    /* logic */ 
} 

此代碼正在從jar和其它類在罐子正確地使用的庫執行。

爲什麼會發生這種情況?我怎樣才能進一步調試呢?

謝謝!

編輯

喬恩斯基特是正確的。一個朋友向我展示瞭如何使用javap -c和我改變了價值的東西更獨特,Type.AAAA,其中有28值:

878: getstatic  #116; //Field java/lang/System.out:Ljava/io/PrintStream; 
881: bipush 28 
+0

添加'-verbose:class'命令行參數是否顯示了一些內容?通常,當你得到這個錯誤時,它是一個不同的類,它被你想要加載的類所引用。 – biziclop 2012-03-02 22:05:06

+0

您能否顯示NoClassDefFoundError的完整堆棧跟蹤?這個錯誤至少在三種不同的情況下引發。 – 2012-03-02 22:05:26

回答

3

這聽起來像是你在執行時缺少dnsjava庫。

這並不爲Type.A重要,因爲這是一個不斷 - 值是由編譯器拉出並直接嵌入到你的代碼,如果你指定它爲文字的整數。它不需要需要庫在執行時出現。當你調用一個方法時,情況顯然不是這樣。

+0

你說得對,Type.A是一個'int',因此可以直接插入值。只是它是一個常量是不夠的,如果它是一個'Type'類型的常量,它不會'工作。 – biziclop 2012-03-02 22:23:06

+0

@biziclop:在這種情況下,它不會是JLS術語中的一個常量:)「基本類型或類型的變量String是最終的,並且使用編譯時常量表達式(第15.28節)進行初始化,被稱爲常量變量。」 – 2012-03-02 22:25:24

+0

@Jon沒有說OP其他類在運行時正確地使用了這個庫的一部分? – nsfyn55 2012-03-02 22:31:58

0

你可能缺少Type類你使用的classpath。你需要運行與-cp參數的罐子。

0

運行時異常被拋出時,type的值是什麼?如果你閱讀java文檔它Converts a String representation of an Type into its numeric value。它可能是通過反射或者一些簡單實例化來實現的。如果你爲沒有關聯的類型字符串運行這個方法,我認爲它完全合理的讓你得到這個錯誤。

第1步:打印字符串類型並確保該類型的類位於類路徑中。