NoClassDefFoundError - PullRequest
       6

NoClassDefFoundError

2 голосов
/ 25 января 2011

У меня есть проблема, когда выбрасывается NoClasDefFoundError.Это озадачивает меня, так как я использую интерфейсы, и никакое определение класса не должно быть доступным.Я прочитал несколько постов, которые указывают на Classpath, но я не считаю, что это проблема здесь (хотя я могу ошибаться).Я использую IDE NetBeans 6.9.1.

Я создал образец установки для воспроизведения проблемы.Четыре проекта: Интерфейсы, Объекты, Локатор и Потребитель.Ниже вы найдете реализации.

Во время выполнения потребитель жалуется на отсутствие реализации SomeObject, о которой он не должен знать, так как он принимает интерфейс.java.lang.NoClassDefFoundError: objects / SomeObject

Что мне не хватает?

package interfaces;
public interface ISomeInterface { }

package objects;
import interfaces.ISomeInterface;
public class SomeObject implements ISomeInterface{ }

package locator;
import interfaces.ISomeInterface;
import objects.SomeObject;
public class Locator { public static ISomeInterface LocateImplementation() { return new SomeObject(); }}

package consumer;
import interfaces.ISomeInterface;
import locator.Locator;
public class Main { public static void main(String[] args) { ISomeInterface object = Locator.LocateImplementation(); }}

Ответы [ 6 ]

6 голосов
/ 25 января 2011

Вы можете получить исключение NoClassDefFoundError с интерфейсами так же, как с классами. Считайте, что «Class» в названии исключения является файлом .class, который генерируется при компиляции класса или интерфейса, а не Java-классом.

Это говорит о том, что объекты класса / интерфейса. SomeObject не виден в вашем пути к классам. Проверьте расположение этого файла .class и убедитесь, что он находится на вашем пути к классам - если вы уверены, что он есть, сделайте несколько снимков экрана или что-то, что может помочь отладить проблему.

3 голосов
/ 25 января 2011

Думайте о NoClassDefFoundError как о проблеме компоновки во время выполнения. JRE загрузил один класс (или интерфейс), и он ссылается на другой класс (или интерфейс), но этот ссылочный класс не найден.

Единственный способ, которым это может произойти, если у вас есть проблемы с упаковкой / classpath, так что ваша среда выполнения не отражает, как обстоят дела во время сборки.

Если вы запускаете это из IDE, убедитесь, что вы не игнорируете никаких ошибок и не запускаете их в любом случае. Некоторые классы не будут сгенерированы таким образом.

1 голос
/ 25 января 2011

Обычно я сталкиваюсь с этими проблемами не при отсутствии класса, а при ошибке в статических инициализаторах.

Попробуйте запустить свой код в отладчике и установите точку останова исключения, чтобы она прерывалась при возникновении любого исключения, пойманного или нет. Могу поспорить, что по какой-то причине у вас есть необработанное исключение в статическом инициализаторе.

0 голосов
/ 02 апреля 2017

Любой интерфейс должен быть объявлен внутри класса

public class Calbacks {
    public interface IBaseFragmentInterface {
        void NotifyMainActivity();
    }
}
0 голосов
/ 25 января 2011

Вы должны проверить, находится ли ваш класс SomeObject в пути к классам, потому что -

Хорошо, JVM будет запускать следующий код -

ISomeInterface object = Locator.LocateImplementation();

, и когда он это сделает, он вызовет Locator.LocateImplementation ().Этот код внутренне пытается создать экземпляр вашего класса SomeObject, которого он не находит в пути к классам.

Итак, ваше понимание ниже

Это озадачивает меня, так как я использую интерфейсы, а определение класса отсутствуетдолжен быть доступен.

Не действительно действителен.

0 голосов
/ 25 января 2011

В методе locateImplementation () вы возвращаете "new SomeObject ()", JVM должна иметь свое определение при вызове. Я думаю, что это отсутствует.

...