Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Swing中捕获此异常?_Java_Swing_Exception - Fatal编程技术网

Java 如何在Swing中捕获此异常?

Java 如何在Swing中捕获此异常?,java,swing,exception,Java,Swing,Exception,我有一个Swing应用程序,即使我在try/块中拥有所有内容,也不会捕获异常 public static void main(String[] args) { try { App app = new App(); app.setVisible(true); } catch (Throwable e) { System.err.println("never printed"); } } 我得到的只是这个堆栈跟踪: Exce

我有一个Swing应用程序,即使我在
try
/
块中拥有所有内容,也不会捕获异常

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)

Swing在事件调度线程中运行。你正试图抓住它的主线

请注意,swing不是线程安全的,您也应该在事件调度线程中进行操作

要捕获异常,可以覆盖该堆栈跟踪中的某些方法,例如组件中的paint方法


对我来说,这个异常看起来确实像是一个你应该修复的bug,而不是你应该通过捕捉来隐藏的东西。

正如另一张海报所提到的,你的问题是异常被抛出到另一个线程中,事件调度线程。有两种解决方案:

  • 在发生异常的实际代码周围放置一个try/catch:例如,如果它是对ActionListener处理的按钮单击的响应,则将try/catch放在actionPerformed()方法中
  • 或者,将异常保留为未捕获的异常,并添加一个。例如:

另一方面,原则上您应该将UI启动代码保存在一个文件中。

如上所述,问题在于引发异常的位置-在事件调度线程上

如果您想设置一个try/catch块来捕获这个特定的问题,我会在App类的paint方法中加入一个。覆盖它并在那里的try-catch块中调用super.paint


如果您想要一种捕获未捕获异常的通用方法,请查看。使用异常处理程序调用该方法,可以处理应用程序中未捕获的所有异常。

运行时异常(如ArrayIndexOutOfBoundsException)显示了程序员的错误。因此,与其抓住它们,静静地咀嚼它们,不如把它们修复好


只是对例外原因的猜测。一旦JTable开始在屏幕上绘制数据,就会同时从表模型的数据向量中删除行。

我所知道的捕获EDT内部抛出的异常的唯一合适方法是:

  • 写你自己的事件队列(我不会 (一般建议)
  • 使用Swing内部属性“
    sun.awt.exception.handler
    ”(我使用 它适用于所有Sun JDK 1.4, 至少是1.5和1.6,在IBM JDK上至少是1.4和1.5;但我没有在其他JDK上检查)

您应该看一看,以更全面地了解这些解决方案的优缺点。

以及如何抓住这一点?可能会有帮助,我不是Java专家:我猜您在某个地方有一个网格,您是对的,但我使用的库对我来说是个例外。因此,当桌子被拉出时,我得到了一个例外。但无论如何,我想知道我能做什么。我可能会修复库,但我不知道。是否有人真的使用Thread.setDefaultUncaughtExceptionHandler()捕获过EDT中抛出的任何异常?我非常怀疑(至少在JDK5上,没有在JDK6上检查),因为EDT自己捕获所有异常,只向System.err发出printStackTrace()。至少在JDK6中,它似乎“正确”地通过了未捕获的异常处理程序。我承认我没有意识到这是在5到6之间发生了变化,但也许。我现在真的能够捕捉到异常。(使用jdk1.6。)在以前的jdk版本上,您必须使用一个非官方的技巧-在处理程序中设置“sun.awt.exception.handler”属性。类似这样的内容:System.setProperty(“sun.awt.exception.handler”,ExceptionHandler.class.getName());public class ExceptionHandler{public void handle(Throwable ex){…}这个技巧仍然有效(直到java 6),但在将来的版本中可能不起作用。我所知道的捕获事件调度线程上未处理异常的唯一方法是注册一个新的EventQueue,如前所述。使用
Thread.setDefaultUncaughtExceptionHandler()
将无法工作。

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