Question

Je suis (à distance) débogage d'une application java / jboss dans Eclipse, pas à pas ligne par ligne. À un moment donné, un tableau d'objets de GridSquare (GridSquare est une classe assez simple, autonome, contient quelques propriétés et méthodes) est créée par un appel de méthode, i.e.:

GridSquare[] squares = this.theGrid.getSquares(14, 18, 220, 222);

... Alors quand j'exécute en fait le code, le tableau de squares ne soit peuplé avec des objets GridSquare, je reçois quelque chose d'étrange quand parcourant le code et le débogage. A un point d'arrêt sur la ligne qui suit immédiatement l'affectation indiquée ci-dessus, si je tente de voir le tableau de squares, au lieu d'une valeur que je reçois ceci:

org.eclipse.debug.core.DebugException: com.sun.jdi.ClassNotLoadedException: Type has not been loaded occurred while retrieving component type of array.

... Quelqu'un sait ce que est à peu près?

Était-ce utile?

La solution

En gros cela signifie que le chargeur de classe n'a pas chargé le locator [] classe. Cela étant dit, cela ressemble à un bug dans le débogueur d'une certaine façon. L'association avec le code breakpoint semble être légèrement cassé. Soit vous devez recompiler pour obtenir les numéros de ligne en synchronisation ou une autre question qui se passe. A ce moment-là dans le code (après la cession), il doit être chargé. À moins getSquares retourne en fait une sous-classe (GridSquareSubclass []) à quel point la machine virtuelle Java peut ne pas avoir chargé parce qu'il n'a pas besoin (pour le moment).

Autres conseils

Je suis tombé sur cette erreur parce que je courais un test unitaire sur le code qui utilise la réflexion. Je l'avais fait une classe spéciale pour tester toutes les fonctionnalités du code. JUnit utilise apparemment un classloader séparé pour les classes de test (ce qui est logique) si mon code n'a pas été en mesure d'utiliser la réflexion sur cette classe. La trace de la pile, je suis arrivé était extrêmement générique (java.lang.InstantiationException) mais quand j'ai vérifié en mode débogage il y avait plus de détails sur l'objet d'exception lui-même (org.eclipse.debug.core.DebugException: com.sun.jdi.ClassNotLoadedException) ce qui m'a amené à cette conclusion.

Alors je me suis déplacé la classe spéciale à la principale classloader (en déplaçant le fichier src / test / java à src / main / java) et il a bien fonctionné. Je n'aime pas cette solution mais je ne peux pas trouver une solution de rechange. Dans mon cas, ce n'est pas une grosse affaire, mais je peux voir comment cela pourrait être une préoccupation pour les autres.

Je l'ai vu arriver dans Eclipse lorsque vous avez des variables de classe d'une sous-classe se cachent des variables d'une classe parente. D'une certaine façon que embrouille Eclipse (et est généralement une mauvaise idée de toute façon :). Par exemple:

class A {
   private String a;
}

class B extends A {
   public String a;
}
//Give a SIZE to the array:
GridSquare[] squares = GridSquare[this.theGrid.size()];

//Fill each element of the array with the object constructor to avoid the null value
for(int i=0; i<this.theGrid.size(); i++){
    squares[i] = new GridSquare();
    squares[i] = this.theGrid.getSquares(14, 18, 220, 222);
}

En initialisant locator va résoudre le problème. carrés = new locator ();

face au même problème, je viens de créer une méthode public static void main, objet créé de même type et Exécuter en tant que application java, je puis retiré principale méthode, il fonctionne maintenant très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top