我正在开发一个带有执行自定义绘画的组件的Swing应用程序。当我在绘画代码中犯了一些错误并引发异常时,这种情况很难调试。不会被调试器捕获,而是显示带有异常信息的弹出窗口。此外,线程似乎已重新启动,并且由于编码错误而导致异常,因此该线程一次又一次地显示出来。
当我有幸切换到调试器时(这很困难,因为随着应用程序收到绘画请求,越来越多的弹出窗口不断出现),调试控制台会向我显示异常信息,例如:
严重:线程中引发了未捕获的异常[AWT-EventQueue-0,6,main] ....堆栈如下
严重:线程中引发了未捕获的异常[AWT-EventQueue-0,6,main]
....堆栈如下
我的应用程序是用Scala编写的,并且正在使用IntelliJ IDEA14。调试器可以很好地处理我未捕获的主线程异常(我已经在中Uncaught exception启用了Any exception断点功能Java Exception Breakpoints),但是AWT线程中的异常却没有。
Uncaught exception
Any exception
Java Exception Breakpoints
我已尝试按照此方法中的描述安装处理程序。如何检测Java中何时全局抛出了异常?回答,但是我的处理程序似乎没有被触发。
我想实现以下(按重要性顺序):
(注意:虽然这是Scala应用程序,但我假设Java的行为相同,因此是Java标记)。
根据此链接,您必须同时处理常规Exception和EDT Exception不使用旧的sun.awt.exception.handlerhack(自Java 7开始不再起作用)
Exception
EDT Exception
sun.awt.exception.handler
这是你的 ExceptionHandler
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()); } });