捕获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 } }
提前感谢。最简单的版本是设置默认的未捕获异常处理程序:
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);