Come gestisco ClassNotLoadedException durante il debug?

Quindi eseguo (remotamente) il debug di un’applicazione java / jboss in Eclipse, passando da una riga all’altra. A un certo punto, una serie di oggetti GridSquare ( GridSquare è una class abbastanza semplice, autonoma, contiene alcune proprietà e metodi) viene creata da una chiamata al metodo, ovvero:

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

… Mentre quando GridSquare effettivamente il codice, l’array dei squares viene popolato con oggetti GridSquare , ottengo qualcosa di strano quando passo attraverso il codice e il debug. In un punto di interruzione sulla linea immediatamente successiva al compito mostrato sopra, se provo a visualizzare l’array dei 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 cosa si tratta?

    Fondamentalmente significa che il programma di caricamento classi non ha caricato la class 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 sottoclass (GridSquareSubclass []) a quel punto la JVM potrebbe non averla caricata perché non ne ha ancora bisogno (ancora).

    Mi sono imbattuto in questo errore perché stavo eseguendo un test unitario 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 class. 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’object Exception stesso (org.eclipse.debug.core.DebugException: com.sun.jdi.ClassNotLoadedException) che mi ha portato a questa conclusione.

    Così ho spostato la class speciale sul classloader principale (spostando il file da src / test / java a 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.

    Ho visto questo accadere in Eclipse quando si hanno variabili di class di una sottoclass che nascondono le variabili di una class genitrice. In qualche modo ciò confonde Eclipse (e in generale è comunque una ctriggers idea :). Per esempio:

     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 

    Inizializzando GridSquare risolverà il problema. squares = new GridSquare ();

    Ho affrontato lo stesso problema, ho appena creato un metodo principale vuoto statico pubblico, creato object dello stesso tipo e Esegui come applicazione java, ho quindi rimosso il metodo principale, ora funziona bene.