小编典典

AWT队列线程中的调试异常

java

我正在开发一个带有执行自定义绘画的组件的Swing应用程序。当我在绘画代码中犯了一些错误并引发异常时,这种情况很难调试。不会被调试器捕获,而是显示带有异常信息的弹出窗口。此外,线程似乎已重新启动,并且由于编码错误而导致异常,因此该线程一次又一次地显示出来。

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

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

....堆栈如下

我的应用程序是用Scala编写的,并且正在使用IntelliJ IDEA14。调试器可以很好地处理我未捕获的主线程异常(我已经在中Uncaught exception启用了Any exception断点功能Java Exception Breakpoints),但是AWT线程中的异常却没有。

我已尝试按照方法中的描述安装处理程序。如何检测Java中何时全局抛出了异常?回答,但是我的处理程序似乎没有被触发。

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

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

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


阅读 216

收藏
2020-11-01

共1个答案

小编典典

根据此链接,您必须同时处理常规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
    }
}

用法:

// 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());
    }
});
2020-11-01