Подтвердить что ты не робот

Как мне работать с 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.

... Кто-нибудь знает, что это значит?

4b9b3361

Ответ 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, затем удалил основной метод, теперь он отлично работает.