2009-09-02 5 views
21

Quindi eseguo (remotamente) il debug di un'applicazione java/jboss in Eclipse, passando da una riga all'altra. Ad un certo punto, un array di oggetti GridSquare (GridSquare è abbastanza semplice classe, standalone, contiene alcune proprietà e metodi) viene creato da una chiamata metodo, vale a dire:Come faccio a gestire ClassNotLoadedException durante il debug?

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

... Mentre quando in realtà eseguire il codice, l'array squares viene popolato con oggetti GridSquare, ottengo qualcosa di strano quando si passa attraverso il codice e il debug. A un punto di interruzione sulla linea immediatamente dopo l'assegnazione mostrato sopra, se provo a visualizzare la matrice squares, invece di un valore ottengo questo:

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

... qualcuno sa di che si tratta?

risposta

20

Fondamentalmente significa caricatore di classe non è stata caricata la classe GRIDSQUARE []. Detto questo sembra in qualche modo un bug nel debugger. L'associazione del punto di interruzione con il codice sembra essere leggermente interrotta. O hai bisogno di ricompilare per ottenere i numeri di linea in sincronia o qualche altro problema sta succedendo. A quel punto nel codice (dopo l'assegnazione) deve essere caricato. A meno che getSquares non restituisca effettivamente una sottoclasse (GridSquareSubclass []) a quel punto la JVM potrebbe non averla caricata perché non ne ha ancora bisogno (ancora).

+0

C'è qualche modo per forzare la JVM per caricare una classe in un particolare momento? Qualcosa di simile a una direttiva del compilatore? – DanM

+13

Puoi caricare la classe nel tuo codice solo per forzarlo a succedere (come avere una linea che carica esplicitamente la classe come la creazione di una nuova matrice del tipo la linea precedente). Si potrebbe anche provare a inviare una direttiva tramite valutare l'espressione nel debugger. (Come un Class.forName() o Array.newInstance()) – Yishai

+0

Questo l'ha fatto. Grazie!! – DanM

0

Ho visto questo accadere in Eclipse quando si dispone di variabili di classe di una sottoclasse che nascondono le variabili di una classe genitore. In qualche modo ciò confonde Eclipse (e in generale è comunque una cattiva idea :). Per esempio:

class A { 
    private String a; 
} 

class B extends A { 
    public String a; 
} 
-3

Ho affrontato lo stesso problema, ho appena creato un metodo main public static void, oggetto creato dello stesso tipo e Esegui come Java Application, ho poi rimosso metodo principale, ora funziona bene.

-1

Con l'inizializzazione GRIDSQUARE risolverà il problema. quadrati = new GridSquare();

0
//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); 
} 
1

Mi sono imbattuto in questo errore perché stavo eseguendo un test di unità sul codice che utilizza la riflessione. Avevo fatto una lezione speciale per testare tutte le funzionalità del codice. Apparentemente Junit utilizza un classloader separato per le classi di test (che ha perfettamente senso), quindi il mio codice non è stato in grado di utilizzare la riflessione su quella classe. La traccia dello stack che ho ottenuto era estremamente generica (java.lang.InstantiationException) ma quando ho controllato la modalità di debug c'erano ulteriori dettagli sull'oggetto Exception stesso (org.eclipse.debug.core.DebugException: com.sun.jdi.ClassNotLoadedException) che mi ha portato a questa conclusione.

così ho spostato la classe speciale per il programma di caricamento classe principale (spostando il file da src/test/java alla src/main/java) e ha funzionato bene. Non mi piace questa soluzione, ma non riesco a capire un'alternativa. Nel mio caso non è un grosso problema, ma posso vedere come questa potrebbe essere una preoccupazione per gli altri.

Problemi correlati