在AWT队列线程中调试异常

Sum*_*uma 3 java debugging scala awt intellij-idea

我正在开发一个Swing应用程序,其中包含执行自定义绘制的组件 当我在绘制代码中犯了一些错误并抛出异常时,情况很难调试.弹出窗口显示异常信息,而不是被调试器捕获.此外,线程似乎重新启动,并且由于编码错误的结果异常,它会一次又一次地显示.

当我很幸运地切换到调试器时(这很困难,因为越来越多的弹出窗口随着应用程序获取绘制请求而不断出现),调试控制台会向我显示异常信息,例如:

严重:线程中抛出未捕获的异常[AWT-EventQueue-0,6,main]

....堆栈如下

我的应用程序是用Scala编写的,我使用的是IntelliJ IDEA 14.我的未被捕获的主线程异常由调试器处理得很好(我已Uncaught exception启用Any exception断点启用Java Exception Breakpoints),但AWT线程中的异常不是.

我已经尝试过安装一个处理程序,如下所述我如何检测Java中全局抛出异常的时间?回答,但我的处理程序似乎没有被触发.

我想实现以下(按重要性顺序):

  1. 避免AWT线程在异常时重新启动,或者至少阻止弹出窗口显示
  2. 在调试器中处理未捕获的异常,而不是在控制台中打印

(注意:虽然这是Scala应用程序,但我认为Java的行为是相同的,因此Java标记).

ToY*_*nos 9

根据此链接,您必须处理常规ExceptionEDT Exception不使用旧的sun.awt.exception.handlerhack(自Java 7以来不再起作用)

这是你的 ExceptionHandler

public static class ExceptionHandler implements Thread.UncaughtExceptionHandler
{
    public void uncaughtException(Thread thread, Throwable thrown)
    {
        // TODO handle your Exception here
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

// Regular Exception
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());

// EDT Exception
SwingUtilities.invokeAndWait(new Runnable()
{
    public void run()
    {
        // We are in the event dispatching thread
        Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler());
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 你的问题让我进一步推动我的调查.实际上,根据[`EventDispatchThread`源代码](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/awt/EventDispatchThread.java#EventDispatchThread .processException%28java.lang.Throwable%29),`getDefaultUncaughtExceptionHandler`从未在`EventDispatchThread`中使用.相反,在`processException`方法中显式调用`getUncaughtExceptionHandler()`.这就解释了为什么`setDefaultUncaughtExceptionHandler`是不够的. (2认同)