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

捕获javax.swing应用程序中的异常,java,swing,exception,awt,catch-all,Java,Swing,Exception,Awt,Catch All,我正在使用javax.swing制作一个应用程序,它从XML模式生成表单(使用JAXFront库),并将用户填写的数据存储到XML文档中 我已经在需要时设置了try-catch-finally块,但是在主线程结束时(AWT线程仍在运行)捕获异常时遇到了一点问题 我有两门课做主要工作,其他课对问题不重要: 主类:它具有以下结构。初始化应用程序并运行主框架 public class Main { public static void main(String[] args) {

我正在使用
javax.swing
制作一个应用程序,它从XML模式生成表单(使用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方法执行visualize函数时,将生成并显示视图。在那一刻,我失去了对异常捕获的控制。然后我的问题是,是否有某种方法可以捕获在这一点之后抛出的可能的运行时异常

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


提前感谢。

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

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    public void uncaughtException(Thread t, Throwable e) {
        // do something
    }
});
但这也捕获了程序其他部分抛出的未捕获异常

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

现在按如下方式安装:

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构造函数。虽然不确定,但值得一试。

非常感谢。你的第一个解决方案解决了我的问题。我不能给你投票,但你接受吧!为了控制退出事件,我设置了
setDefaultCloseOperation(关闭时不执行任何操作)
添加WindowListener(新的WindowAdapter(){…})哪个进行清理。
setDefaultCloseOperation(EXIT_ON_CLOSE);