java.lang.NoClassDefFoundError выбрасывается для статического метода, но не для статического члена - PullRequest
1 голос
/ 03 марта 2012

Работая с библиотекой 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, и другие классы в банке правильно используют библиотеку.

Почему и как это могло произойти?Как я могу отладить это дальше?

Спасибо!

РЕДАКТИРОВАТЬ

Джон Скит был прав.Друг показал мне, как использовать javap -c, и я изменил значение на что-то более отчетливое, Type.AAAA, значение которого равно 28:

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

Ответы [ 3 ]

3 голосов
/ 03 марта 2012

Звучит так, как будто во время выполнения отсутствует библиотека dnsjava.

Это не имеет значения для Type.A, потому что это константа - значение извлекаетсякомпилятором и встроен непосредственно в ваш код, как если бы вы указали его как целочисленный литерал. не требуется библиотека, присутствующая во время выполнения.Это явно не тот случай, когда вы вызываете метод.

0 голосов
/ 03 марта 2012

Что это за значение type при возникновении исключения во время выполнения?если вы читаете документацию Java, это Converts a String representation of an Type into its numeric value.Это, вероятно, делает это путем создания его рефлексивно или какой-то грязи.Если вы запустите этот метод для строки типа, с которой не связано Type, я думаю, что для вас вполне разумно получить эту ошибку.

Шаг 1: напечатайте строковый тип и убедитесь, что класс этого типа находится на пути к классам.

0 голосов
/ 03 марта 2012

Возможно, вам не хватает класса Type во время выполнения classpath . Вам нужно запустить банку с аргументом -cp.

...