我正在使用javax.swing
创建一个应用程序,它从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 。
我希望你能理解我的英语,并能回答这个问题。
提前致谢。
答案 0 :(得分:23)
最简单的版本是设置默认的未捕获异常处理程序:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
// do something
}
});
但是,这可以捕获程序其他部分中未被捕获的异常。
但是,您只能使用代理捕获抛出事件调度线程抛出的运行时异常(有关详细信息,请参阅this页面,从那里复制代码):
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());
答案 1 :(得分:1)
调用visualize()
后,唯一运行的线程是Swing / AWT事件调度线程。如果要捕获任何异常,则需要在此线程上调用的任何侦听器方法中执行此操作,例如
public void actionPerformed(ActionEvent e) {
try {
// Some code here
} catch(RuntimeException e) {
// Handling code here
}
}
为防止样板,您可以在超类中使用此代码。
请注意,如果您想捕捉Swing / AWT线程尚未处理的任何内容,您也可以设置default uncaught exception handler。
另请注意,一般来说,如果可以避免,最好不要捕获RuntimeException的子类。
答案 2 :(得分:0)
尝试添加:
setDefaultCloseOperation(EXIT_ON_CLOSE);
到MyFrame构造函数。虽然不确定,但值得一试。