Как мне поймать это исключение в Swing? - PullRequest
8 голосов
/ 11 апреля 2009

У меня есть приложение Swing, и хотя у меня есть все в try / block, исключение не фиксируется.

public static void main(String[] args) {

    try {
        App app = new App();
        app.setVisible(true);

    } catch (Throwable e) {
       System.err.println("never printed");
    }
}

все, что я получаю, это трассировка стека:

Exception in thread "AWT-EventQueue-0" 
java.lang.ArrayIndexOutOfBoundsException: 
9 >= 9
at java.util.Vector.elementAt(Vector.java:427)
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:633)
at javax.swing.JTable.getValueAt(JTable.java:2695)
at javax.swing.JTable.prepareRenderer(JTable.java:5712)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2075)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1977)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1773)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
at javax.swing.JComponent.paintComponent(JComponent.java:763)
at javax.swing.JComponent.paint(JComponent.java:1027)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1036)
at javax.swing.JViewport.paint(JViewport.java:747)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1036)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1036)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1036)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:564)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5129)
at javax.swing.BufferStrategyPaintManager.paint
(BufferStrategyPaintManager.java:277)
at javax.swing.RepaintManager.paint(RepaintManager.java:1217)
at javax.swing.JComponent.paint(JComponent.java:1013)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
at java.awt.Container.paint(Container.java:1780)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run
(SystemEventQueueUtilities.java:128)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters
(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter
(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy
(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Ответы [ 5 ]

10 голосов
/ 11 апреля 2009

Как уже упоминалось другим автором, ваша проблема в том, что исключение выдается в другом потоке, потоке отправки событий. Пара решений:

  • поместите try / catch вокруг фактического кода, где происходит исключение: например, если это в ответ на нажатие кнопки, обрабатываемое ActionListener, поместите try / catch в ваш метод actionPerformed ();
  • или, оставьте исключение как необработанное исключение и добавьте обработчик необнаруженного исключения . Например:

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
      public void uncaughtException(Thread t, Throwable e) {
        // ... do something with exception here ...
      }
    });

В дополнение к этому, в принципе, вы должны указывать код запуска пользовательского интерфейса в SwingUtilities.invokeLater () .

2 голосов
/ 12 апреля 2009

Исключения во время выполнения, такие как ArrayIndexOutOfBoundsException, показывают ошибку программиста. Так что, может быть, лучше их починить и молча пережевывать.

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

2 голосов
/ 11 апреля 2009

Swing запускает вещи в потоке диспетчеризации событий. Вы пытаетесь перехватить его в главном потоке.

И обратите внимание, что Swing не является потокобезопасным, вы тоже должны делать что-то в потоке диспетчеризации событий.

Чтобы поймать исключение, вы можете переопределить некоторый метод из этой трассировки стека, например метод рисования из вашего компонента.

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

1 голос
/ 13 апреля 2009

Единственные подходящие способы, которые мне известны, для обнаружения исключений, генерируемых из EDT:

  • написать свой собственный EventQueue (я не буду советую в общем)
  • использовать внутреннее свойство Swing "sun.awt.exception.handler" (использую это и работает на всех Sun JDK 1.4, 1.5 и 1.6 минимум, плюс на IBM JDK 1.4 и 1.5 минимум; Я не проверял это на другом JDK, хотя)

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

0 голосов
/ 12 апреля 2009

Как упоминалось выше, проблема в том, что генерируется исключение - в потоке отправки событий.

Если вы хотите настроить блок try / catch, чтобы поймать эту конкретную проблему, я бы бросил его в метод рисования класса App. Переопределите его и поместите вызов super.paint в блок try catch.

Если вы хотите использовать универсальный способ перехвата необработанных исключений, взгляните на Thread.setUncaughtExceptionHandler . Вы вызываете этот метод с помощью обработчика исключений и можете работать со всеми исключениями, которые не попадают в ваше приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...