使用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
答案 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在类路径上。