当前位置: 首页 > 面试题库 >

AWT队列线程中的调试异常

陈项禹
2023-03-14
问题内容

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

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

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

....堆栈如下

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

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

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

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

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


问题答案:

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


 类似资料:
  • 我正计划创建可调整队列大小的可调整线程池。我正在使用unbounded LinkedBlockingQueue和一个外部设置,该设置控制排队的消息数量。最初,my corepoolsize和maxpoolsize是相等的。现在,如果我想在运行时更新我的线程池大小,我通过一个公共设置将corepoolsize和maxpoolsize设置为不同的值。我想知道你对这种做法有什么看法。 当maxpools

  • 我正在尝试将文件读取到中,但它提供了一些异常。我正在使用POI库。我该怎么办?请帮帮我。这是我的代码: 这是:

  • 出于某种原因,这段代码给出了标题中给出的错误,然后是大量异常列表。然后控制台会加载,但不会加载任何数据,您必须将鼠标悬停在控制台的每个部分上才能让它显示出来。有什么帮助吗? 编辑:以下是例外:

  • 问题内容: 我们希望在应用程序日志中跟踪这些异常-默认情况下,Java只会将它们输出到控制台。 问题答案: 在EDT中和EDT外,未捕获的异常之间存在区别。 另一个问题有一个解决方案,但是如果您只想咀嚼EDT部分的话…

  • 问题内容: 我在使用netbeans Swing GUI的线程方面遇到问题。这是我第一次真正尝试使用Java的文件系统通知程序为备份程序开发GUI。我有两个文件和。 我几乎要发生的事情是,在文本字段中输入目录路径,该目录路径将创建一个同步线程,该线程将创建一个新的同步对象,然后对该对象进行调用。当该目录中的文件更改时,我想将有关更改的文本添加到列表中。 在当前状态下,UI不再无响应,但是并没有在我

  • 我需要一个库或我们的软件工具,可以: 1)将线程/作业/任务(任何东西--如果需要,我们可以重写代码,我们在mintue有线程对象)放入像system这样的队列中2)我们可以定义同时最多运行多少线程3)线程完成后,线程从队列中移除,这样GC就可以移除所有涉及的实体。 我正在进行大量阅读,发现ExecutorService(Executors.newFixedThreadPool(5);)但问题可能