Исключение со Stacktrace, содержащим только вызовы библиотеки Java

Какой возможный ход действий можно предпринять, чтобы выяснить, что пошло не так, если трассировка стека ошибки (которой нет в основном потоке) не содержит ни одного из ваших методов? Полный след в вопросе:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
    at java.util.Vector.elementAt(Unknown Source)
    at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderRenderer(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderHeight(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.createHeaderSize(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(Unknown Source)
    at javax.swing.JComponent.getPreferredSize(Unknown Source)
    at javax.swing.ViewportLayout.preferredLayoutSize(Unknown Source)
    at java.awt.Container.preferredSize(Unknown Source)
    at java.awt.Container.getPreferredSize(Unknown Source)
    at javax.swing.JComponent.getPreferredSize(Unknown Source)
    at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
    at java.awt.Container.layout(Unknown Source)
    at java.awt.Container.doLayout(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validate(Unknown Source)
    at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

В настоящее время я пытался запустить процесс в фоновом режиме, используя SwingWorker, который в конце обновляет JTable новыми данными. Весь код, связанный с этой задачей, слишком велик для размещения здесь, и мне интересно, есть ли способ сузить источник ошибки.

5 ответов

Решение

Трассировка стека может не содержать никаких ваших методов, но это не значит, что она не содержит ни одного из созданных вами объектов. В этом случае проблема, скорее всего, находится в вашей TableModel,

Для отладки такой трассировки стека я обычно использую один из следующих методов:

  • Подумайте, где вы используете эти стандартные классы JDK, и, взглянув на трассировку стека, вы уже можете получить довольно хорошее представление о том, что идет не так (как видно из ответов на этот вопрос, поскольку у нас есть только трассировка стека)
  • поместите "точку останова исключения" в вашей IDE, которая, по крайней мере, позволит вам использовать ваш отладчик и получить больше информации, чем то, что доступно в трассировке стека. Может облегчить распознавание ваших собственных объектов и получить представление о том, где в вашем коде находится проблема
  • присоедините исходный код JDK к своему проекту и поместите обычную точку останова в исходный код JDK, чтобы вы могли начать отладку.
  • Вместо использования стандартного объекта JDK, сделайте, например, анонимное расширение обычного класса JDK и переопределите проблемный метод, просто вызвав super, Это позволяет вам установить точку останова в проблемном методе вашего проблемного объекта.

Все это сводится (кроме первого подхода) к тому же: запустите мой отладчик, чтобы я мог более тщательно изучить все связанные объекты, чтобы понять, что происходит не так. И как только вы поймете проблему, ее решение в большинстве случаев довольно тривиально

Ваш JTable (или ваша новая модель) не имеет столбцов, вызывая ArrayIndexOutOfBoundsException, когда внутренний код вызывает DefaultTableColumnModel.getColumn,

Убедитесь, что ваш стол имеет размер, отличный от 0.

Обычно такого рода трассировки стека (NPE или IndexOutOfBounds во время компоновки / рисования Swing, см. Классы RepaintManager/Look&Feel в трассировке) вызваны тем, что вы не создаете / не изменяете компоненты Swing в EDT (нить диспетчеризации событий). Это включает в себя обновление модели данных Swing, такой как TableModel, которая запускает события, которые вызывают перерисовку.

Для получения дополнительной информации выполните поиск по "учебнику по параллельности java swing".

@Vulcan решил вашу конкретную проблему.

В общем, если в трассировке стека нет ни одного из ваших методов, поищите вещи, которые вы использовали ранее, и которые теперь выполняются каким-либо потоком демона. Например, в этом случае вы запутались в таблице, и во время рисования, не используя ни один из ваших методов, дела пошли на юг.

Другие вещи, которые нужно искать, это недопустимые параметры конфигурации, будь то файлы конфигурации, параметры командной строки, переменные среды и тому подобное.

И это то, что, если ваши методы не вызвали ошибку, то это произошло до того, как все испортилось.

Конечно, в очень редких случаях вы можете обнаружить ошибку!

Вы можете отлаживать классы java.*, Используя rt.jar и настройку вашей IDE, чтобы позволить отслеживать и входить в эти классы. Затем поместите точку останова в верхние методы трассировки стека и попытайтесь выяснить, что вы сделали с визуальным компонентом, который вызывает ошибку.

В качестве альтернативы, только анализируя трассировку стека, вы могли бы дать подсказку о проблеме, например, в этом случае getColumn() проблемная строка, поэтому должно быть все, что вы сделали со столбцами таблицы. Индекс 0 >= 0 дать вам еще один совет о количестве ожидаемых или реально присутствующих столбцов.

Как правило, вам необходимо глубокое понимание поведения компонентов, чтобы выяснить причину.

Другие вопросы по тегам