繁体   English   中英

捕获javax.swing应用程序中的异常

[英]Catch exceptions in javax.swing application

我正在使用javax.swing来创建一个aplication,它从XML Schema生成表单(使用JAXFront库),并将用户填充的数据存储到XML文档中。

我在需要时放了try-catch-finally块,但是当主线程结束时(AWT线程仍然在运行),我遇到了一些问题。

我有两个主要工作的课程和其他对这个问题不重要的课程:

  • 主类 :它具有以下结构。 初始化应用程序并运行主框架

     public class Main { public static void main(String[] args) { readArgs(); // An INI file with the app config Model model = initializeElements(args); // My model class try { MyFrame mfr = new MyFrame(title,model); mfr.visualize(); // Assembling view and setting visible } catch( Excepion e ) { doCleanUp(); System.exit(-1); } } } 
  • 帧类 :生成视图和侦听事件

     public class MyFrame extends JFrame implements ActionListener,MenuListener { // Some attributes // Other mthods without importance /** * Compose the elements, add listeners and set visible the frame */ public void visualize() { generateFormPanel(); setListeners(); validate(); setVisible(true); } public MyFrame(String title, Modele model) { super(title); createElementsUsing(model); } public void actionPerformed(ActionEvent e) { // Code to manage events } } 

嗯,问题如下:当从main方法中执行可视化函数时,生成并显示视图。 那一刻是我失去了对异常捕捉的控制。 然后我的问题是,是否有一些方法来捕获此点后抛出的可能的RuntimeExceptions

我希望你能理解我的英语,并能回答这个问题。

提前致谢。

最简单的版本是设置默认的未捕获异常处理程序:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    public void uncaughtException(Thread t, Throwable e) {
        // do something
    }
});

但是,这也抓住了程序其他部分抛出的未被捕获的异常。

但是,您只能使用代理捕获抛出事件调度线程抛出的运行时异常(有关更多信息,请参阅页面,从那里复制代码):

class EventQueueProxy extends EventQueue {

    protected void dispatchEvent(AWTEvent newEvent) {
        try {
            super.dispatchEvent(newEvent);
        } catch (Throwable t) {
            // do something more useful than: t.printStackTrace();
        }
    }
}

现在安装它像这样:

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueueProxy());

在调用visualize() ,唯一运行的线程是Swing / AWT事件调度线程。 如果要捕获任何异常,则需要在此线程上调用的任何侦听器方法中执行此操作,例如

public void actionPerformed(ActionEvent e) {
  try {
    // Some code here
  } catch(RuntimeException e) {
    // Handling code here
  }
}

为了防止样板,您可以在超类中使用此代码。

请注意,如果要捕获Swing / AWT线程尚未处理的任何内容,也可以设置默认的未捕获异常处理程序

另请注意,一般情况下,如果可以避免,则最好不要捕获RuntimeException的子类。

尝试添加:

setDefaultCloseOperation(EXIT_ON_CLOSE);

到MyFrame构造函数。 虽然不确定,但值得一试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM