Как мне работать с ClassNotLoadedException во время отладки?
Итак, я (удаленно) отлаживаю приложение java/jboss в Eclipse, переходя по строкам. В какой-то момент массив GridSquare
objects (GridSquare
- довольно простой, автономный класс, содержит несколько свойств и методов) создается вызовом метода, то есть:
GridSquare[] squares = this.theGrid.getSquares(14, 18, 220, 222);
... Когда я действительно выполняю код, массив squares
заполняется объектами GridSquare
, я получаю что-то нечетное при переходе через код и отладке. В точке останова на строке, непосредственно следующей за назначением, показанным выше, если я пытаюсь просмотреть массив squares
вместо значения, я получаю следующее:
org.eclipse.debug.core.DebugException: com.sun.jdi.ClassNotLoadedException: Type has not been loaded occurred while retrieving component type of array.
... Кто-нибудь знает, что это значит?
Ответы
Ответ 1
В основном это означает, что загрузчик классов не загрузил класс GridSquare []. Говорят, что это похоже на ошибку в отладчике. Связь точки прерывания с кодом, по-видимому, немного нарушена. Либо вам нужно перекомпилировать, чтобы получить номера строк в синхронизации, либо какая-то другая проблема продолжается. В этот момент кода (после назначения) его необходимо загрузить. Если getSquares фактически возвращает подкласс (GridSquareSubclass []), в этот момент JVM, возможно, не загрузила его, потому что он ему не нужен (пока).
Ответ 2
Я столкнулся с этой ошибкой, потому что я запускал unit test для кода, использующего отражение. Я сделал специальный класс для тестирования всех функций кода. Junit явно использует отдельный загрузчик классов для тестовых классов (что имеет смысл), поэтому мой код не смог использовать отражение в этом классе. Трассировка стека, которую я получил, была чрезвычайно обобщенной (java.lang.InstantiationException), но когда я проверил режим отладки, было больше деталей самого объекта Exception (org.eclipse.debug.core.DebugException: com.sun.jdi.ClassNotLoadedException) что привело меня к такому выводу.
Итак, я переместил специальный класс в основной загрузчик классов (перемещая файл из src/test/java в src/main/java), и он отлично работал. Мне не нравится это решение, но я не могу найти альтернативы. В моем случае это не очень важно, но я вижу, как это может быть проблемой для других.
Ответ 3
Я видел это в Eclipse, когда у вас есть переменные класса подкласса, скрывающие переменные родительского класса. Каким-то образом это путает Eclipse (и вообще это плохая идея). Например:
class A {
private String a;
}
class B extends A {
public String a;
}
Ответ 4
//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);
}
Ответ 5
Инициализация GridSquare решит проблему.
squares = new GridSquare();
Ответ 6
Я столкнулся с той же проблемой, я просто создал публичный статический основной метод void, создал объект того же типа и Run As java Application, затем удалил основной метод, теперь он отлично работает.