web-dev-qa-db-fra.com

Comment gérer une exception ClassNotLoadedException lors du débogage?

Je débogue donc (à distance) une application Java/jboss dans Eclipse, en parcourant ligne par ligne. À un moment donné, un tableau d'objets GridSquare (GridSquare est une classe autonome assez simple, contient quelques propriétés et méthodes) est créé par un appel de méthode, à savoir:

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

... Alors que lorsque j'exécute réellement le code, le tableau squares est rempli d'objets GridSquare, j'obtiens quelque chose d'étrange en parcourant le code et en déboguant. À un point d'arrêt sur la ligne suivant immédiatement l'affectation indiquée ci-dessus, si j'essaie d'afficher le tableau squares, au lieu d'une valeur, j'obtiens 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 de quoi il s'agit?

26
DanM

Fondamentalement, cela signifie que le chargeur de classe n'a pas chargé la classe GridSquare []. Cela étant dit, cela ressemble à un bug dans le débogueur d'une manière ou d'une autre. L'association du point d'arrêt avec le code semble être légèrement rompue. Soit vous devez recompiler pour synchroniser les numéros de ligne, soit un autre problème se produit. À ce stade du code (après l'affectation), il doit être chargé. À moins que getSquares ne retourne réellement une sous-classe (GridSquareSubclass []), auquel cas la JVM ne l'a peut-être pas chargée car elle n'en a pas (encore) besoin.

25
Yishai

J'ai rencontré cette erreur car je faisais un test unitaire sur du code qui utilise la réflexion. J'avais créé une classe spéciale pour tester toutes les fonctionnalités du code. Junit utilise apparemment un chargeur de classe séparé pour les classes de test (ce qui est parfaitement logique), donc mon code n'a pas pu utiliser la réflexion sur cette classe. La trace de pile que j'ai obtenue était extrêmement générique (Java.lang.InstantiationException) mais lorsque j'ai vérifié en mode débogage, il y avait plus de détails sur l'objet Exception lui-même (org.Eclipse.debug.core.DebugException: com.Sun.jdi.ClassNotLoadedException) ce qui m'a conduit à cette conclusion.

J'ai donc déplacé la classe spéciale vers le chargeur de classe principal (en déplaçant le fichier de src/test/Java vers src/main/Java) et cela a bien fonctionné. Je n'aime pas cette solution mais je ne peux pas trouver d'alternative. Dans mon cas, ce n'est pas un gros problème, mais je peux voir comment cela pourrait être une préoccupation pour les autres.

1
James Watkins

J'ai vu cela se produire dans Eclipse lorsque vous avez des variables de classe d'une sous-classe masquant les variables d'une classe parente. D'une certaine manière, cela confond Eclipse (et c'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;
}
0
studgeek
//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);
}
0
juldeh