2011-01-25 3 views
2

J'ai un problème où NoClasDefFoundError est levé. Cela me laisse perplexe puisque j'utilise des interfaces, et aucune définition de classe ne devrait être disponible. J'ai lu quelques articles qui pointent vers Classpath, mais je ne crois pas que ce soit le problème ici (même si je peux me tromper). J'utilise NetBeans 6.9.1 IDE.NoClassDefFoundError

J'ai créé un exemple de configuration pour reproduire le problème. Quatre projets: Interfaces, Objets, Localisateur et Consommateur. Vous trouverez ci-dessous les implémentations. Lors de l'exécution, le consommateur coplains à propos de l'implémentation manquante de SomeObject, dont il ne devrait pas être conscient car il accepte l'interface.

Exception in thread "main" java.lang.NoClassDefFoundError: objects/SomeObject

Que manque-t-il?

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(); }} 
+0

Merci à tous pour de grandes réponses !! C'était un problème de classpath après tout. Je ne savais pas que le consommateur avait aussi besoin de voir des "objets", malgré le fait que "locator" les avait dans son classpath. –

Répondre

6

Vous pouvez obtenir une exception NoClassDefFoundError avec des interfaces comme vous pouvez le faire avec les classes. Considérez la "Classe" dans le nom de l'exception comme étant le fichier .class généré à partir de la compilation d'une classe ou d'une interface, et non d'une classe Java. Cela signifie que les objets de classe/interface.SomeObject n'est pas visible sur votre chemin de classe. Vérifiez l'emplacement de ce fichier .class et assurez-vous qu'il se trouve sur votre chemin de classe - si vous êtes sûr qu'il est là, donnez-nous quelques captures d'écran ou quelque chose qui pourrait aider à déboguer le problème.

3

Pensez à NoClassDefFoundError comme un problème de liaison d'exécution. JRE a chargé une classe (ou une interface) et fait référence à une autre classe (ou à une interface), mais cette classe référencée est introuvable.

La seule façon cela peut se produire si vous avez des problèmes d'emballage/classpath tels que votre environnement d'exécution ne reflète pas la façon dont les choses sont au moment de la construction.

Si vous lancez cela à partir de l'EDI, assurez-vous de ne pas ignorer les erreurs et de ne pas les lancer quand même. Certaines classes ne seront pas générées de cette façon.

+0

C'était mon problème: Une référence d'une référence n'était pas dans mon classpath. – boettger1

0

Dans la méthode locateImplementation(), vous renvoyez "new SomeObject()", JVM doit avoir sa définition lorsqu'il est appelé. Je pense que c'est manquant.

0

Vous devriez vérifier si votre classe SomeObject est dans le chemin de classe parce que -

Eh bien la machine virtuelle Java sera en cours d'exécution du code ci-dessous -

ISomeInterface object = Locator.LocateImplementation(); 

et quand il le fait qu'il appellera Locator.LocateImplementation (). Ce code essaye en interne d'instancier votre classe SomeObject qu'il ne trouve pas dans le classpath.

Ainsi, votre compréhension ci-dessous

It puzzles me since I am using interfaces, and no class definition should be available.

est pas vraiment valide.

1

Habituellement je rencontre ces problèmes pas quand une classe est manquante, mais quand il y a une erreur dans les initialiseurs statiques.

Essayez d'exécuter votre code dans un débogueur, et définir le point d'arrêt d'exception à briser lorsqu'une exception est levée, que ce soit pris ou non. Je parie que vous avez une exception non interceptée dans l'initialiseur statique pour une raison quelconque.

0

Toute interface doit être déclarée à l'intérieur de la classe

public class Calbacks { 
    public interface IBaseFragmentInterface { 
     void NotifyMainActivity(); 
    } 
}