java - 我在 Java Swing 中遇到异常,但程序继续正常运行。我应该担心吗?

标签 java swing exception swingworker

我正在使用 SwingWorker 来更新部分 GUI,我对使用它们还比较陌生,所以我不确定是什么原因造成的,或者它是否重要。基本上,当这一大进程完成从在线收集数据时,SwingWorker 会通知 JTable 使用新信息进行更新。它确实如此,并且 GUI 完全按照它应该的方式工作。但是,控制台打印此异常:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 19 >= 18
at java.util.Vector.elementAt(Vector.java:470)
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:649)
at javax.swing.JTable.getValueAt(JTable.java:2720)
at javax.swing.JTable.prepareRenderer(JTable.java:5718)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2114)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2016)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1812)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at javax.swing.JComponent.paintComponent(JComponent.java:778)
at javax.swing.JComponent.paint(JComponent.java:1054)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JViewport.paint(JViewport.java:725)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
at javax.swing.RepaintManager.paint(RepaintManager.java:1206)
at javax.swing.JComponent._paintImmediately(JComponent.java:5169)
at javax.swing.JComponent.paintImmediately(JComponent.java:4980)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

而且我讨厌这个异常,因为它没有指向 代码中的任何地方。我知道在此异常之前会发生什么,因为一段时间以来我一直试图自己解决这个问题,但我无法找到 ArrayOutOfBoundsError 应该出现的位置。我相当确定它与更新 JTable 有关,但该表工作正常。

所以,我要问的是,任何人都可以告诉我为什么会发生这种情况,而且我是否应该担心,因为该程序仍然可以正常运行?

编辑:经过大量测试后,我确定我无法在另一个程序中重现此异常。我还发现它在随机时间发生,但总是在调用另一个类中的某个方法之后发生。此调用是从 SwingWorker 的 process() 方法进行的,它所做的只是从 DefaultTableModel 中删除所有行,然后添加包含新信息的行,在 for 循环中一次一个。通过打印到控制台,我发现异常将在 for 循环开始之前、结束之后或在 for 循环期间的某个随机时间抛出。我已经在没有发生异常的情况下运行了整个过程。这是所讨论方法的一般版本:

    for(int i = table.getRowCount() - 1; i >= 0; i--)
        model.removeRow(i);

    for(InfoObject o : listOfInfoObjects) {
        int[] stats = o.getStats();
        model.addRow(new Object[] {o.getName(),
        stats[0], stats[1], stats[2], stats[3], stats[4], stats[5]});
    }

我不知道这是否有任何帮助,但这是我要添加的全部内容,抱歉。

最佳答案

最可能的原因是您的程序中线程使用不当。 Swing 运行一个称为事件调度线程的线程,对控件、布局等的所有更改都必须在该线程上完成。

您可以使用 SwingUtilties.invokeLater 在 EDT 上执行代码。

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

关于java - 我在 Java Swing 中遇到异常,但程序继续正常运行。我应该担心吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22000764/

相关文章:

java - main 中的 String[] args

java - 如何更新随 Play 提供的 Hibernate?

java - 通过 Swing 按钮停止线程

.net - Entity Framework 错误 - "The EntityContainer name must be unique"

forms - 子程序中 FORM-ENDFORM 中的异常捕获

java - linux用java直接输出到屏幕

java - 如何使用 API 服务器端将我的帐户中的数据提供给 Google 登录用户?

java - 用数组填充 Jtable

java - 在数据更改时刷新 Jframe

c++ - 从 ASSERT_THROW 获取异常信息