2012-03-02 4 views
1

Работа с dnsjava библиотеки, я столкнулся разочарование и запутанной проблемой, где я могу назвать Type.A правильно, но вызывая Type.value(str) бросает java.lang.NoClassDefFoundError.java.lang.NoClassDefFoundError выброшенные для статического метода, но не для статического члена

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

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

Этот код выполняется из через jar и других классов в банке используют библиотеку правильно.

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

Спасибо!

EDIT

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

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

Добавляет ли аргумент командной строки '-verbose: class' что-то? Часто, когда вы получаете эту ошибку, это другой класс, который отсутствует, тот, на который ссылается класс, который вы хотите загрузить. – biziclop

+0

Не могли бы вы показать полную стек из NoClassDefFoundError? Эта ошибка возникает, по крайней мере, в трех разных ситуациях. –

ответ

3

Похоже, что вам не хватает библиотеки во время выполнения.

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

+0

Вы правы, Type.A является «int», и поэтому значение можно вытащить прямо. Просто тот факт, что это константа, недостаточно, если бы она была константой типа 'Type', т работы. – biziclop

+0

@biziclop: в этом случае он не будет константой в терминологии JLS :) «Переменная примитивного типа или типа String, которая является окончательной и инициализирована выражением постоянной времени компиляции (§15.28), называется константой переменная «. –

+0

@ Джон не говорил, что другие классы правильно используют части этой библиотеки во время выполнения? – nsfyn55

0

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

0

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

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