在 Swing GUI 应用程序中捕获异常

Posted

技术标签:

【中文标题】在 Swing GUI 应用程序中捕获异常【英文标题】:Catching Exceptions in Swing GUI application 【发布时间】:2013-08-09 13:23:53 【问题描述】:

我有一个 GUI Swing 应用程序。

有没有办法捕获所有异常?

我创建了一个数据库类来保存我的数据库 JDBC 对象。

它在我的 Swing GUI 类中被声明为一个字段。

e.g. 

public class MySwingGUI 

  protected Database database = new Database();

因此,如果任何异常从 GUI 代码中的某处向上传播,我想以某种方式处理它,以便我可以关闭数据库连接。

有什么想法吗?

【问题讨论】:

【参考方案1】:

确实,您的代码应该在异常发生的地方捕获它们,并适当地处理它们。数据库只需要在适当的退出条件下关闭。

UI 线程上任何未处理的异常都会使应用程序崩溃。在这种情况下,您无需担心关闭数据库;该应用已死。

您可能正在寻找的是未捕获的异常处理程序。只需在 UI 线程上设置未捕获的异常处理程序即可。

见UncaughtExceptionHandler doc

这更多是为了调试。这不是处理错误的好方法。

【讨论】:

我想我最初的问题并不重要......在阅读了您的帖子并在此基础上进行了更多研究之后,我遇到了“在 Swing 应用程序中,默认行为仍将堆栈跟踪打印到“ javapractices.com/topic/TopicAction.do?Id=229 ... 所以,看起来 RuntimeExceptions 不会杀死我的 GUI @ycomp 可能我的回答可以帮助您处理 runtimeException :)【参考方案2】:

在 Swing 中处理异常的另一种方法。你可以使用这样的东西。

public class EventQueueProxy extends EventQueue 

    private static final Logger logger = Logger.getLogger( EventQueueProxy.class.getName() );

    protected void dispatchEvent( AWTEvent newEvent )
    
        try 
            super.dispatchEvent( newEvent );
         catch( RuntimeException | Error e ) 
            logger.error(e.getCause(),e);            
            JOptionPane.showMessageDialog( null, "someDescriptiveMessage");
        
    

你可以使用辅助方法来设置它

    public static void captureUncaughtExceptionInEvent()
    

            EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
            queue.push(new EventQueueProxy());
    

【讨论】:

以上是关于在 Swing GUI 应用程序中捕获异常的主要内容,如果未能解决你的问题,请参考以下文章

用Swing开发GUI程序(基础知识)

带有安全管理器的 Swing 应用程序导致奇怪的 GUI 刷新问题

如何在 Swing 中实现动态 GUI

使用 Spring 进行 Swing GUI 开发

带有 keylisteners 的 Java swing gui 程序在 linux 中不起作用

GUI编程Swing的简单应用