java.lang.NoClassDefFoundError为静态方法抛出但不为静态成员抛出

时间:2012-03-02 21:59:29

标签: java exception dnsjava

使用dnsjava库时,我遇到了一个令人沮丧且令人困惑的问题,我可以正确调用Type.A,但调用Type.value(str)会抛出java.lang.NoClassDefFoundError

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

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

此代码正在从jar执行,而jar中的其他类正确使用该库。

为什么以及如何发生这种情况?我该如何进一步调试?

谢谢!

修改

Jon Skeet是对的。一位朋友向我展示了如何使用javap -c并将值更改为更明确的值Type.AAAA,其值为28:

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

3 个答案:

答案 0 :(得分:3)

听起来你在执行时错过了dnsjava库。

这对Type.A无关紧要,因为它是常量 - 编译器会将值拉出并直接嵌入到代码中,就像您将其指定为整数文字。它不需要库在执行时出现。当你调用一个方法时,情况显然不是这样。

答案 1 :(得分:0)

您可能错过了运行时classpath上的Type类。您需要使用-cp参数运行jar。

答案 2 :(得分:0)

抛出运行时异常时type的值是多少?如果你阅读了java doc Converts a String representation of an Type into its numeric value。它可能是通过反射性地实例化或者某种淤泥来实现的。如果你为没有关联Type的类型字符串运行此方法,我认为你得到这个错误是完全合理的。

步骤1:打印字符串类型并确保该类型的Class在类路径上。