我试图把一个"赶上所有"用于捕获我的代码中发生的任何异常的代码,以便将其发送到服务器。基本上,下面的代码是我的主要代码。这将创建一个带按钮的Jframe。当我点击其中一个按钮时,我导致崩溃(取消引用空指针)。但是,如果异常没有被下面的代码捕获,而是显示在我的控制中。
public static void main(String args[]) {
try {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
JFRAME_MAIN = new MainHomePage();
JFRAME_MAIN.setVisible(true);
}
});
} catch (Exception ex) {
System.out.println("Exception caught"); // <--- This is not being hit
}
}
知道为什么或如何解决这个问题?
由于
PS:我没有把MainHomePage类的代码放在一起,因为它是一个大类,可以设置布局并添加按钮和动作监听器。在其中一个听众中,我发生了崩溃
答案 0 :(得分:1)
未捕获异常,因为try-catch块中的代码不会抛出异常。此代码不处理按钮单击,它由ActionListener
处理。监听器中的代码抛出了异常。
invokeLater
方法只是向队列添加Runnable
,添加Runnable
的行为成功,因此不会生成异常。请参阅this page。
在你的侦听器代码中添加一个try-catch来处理你的按钮点击,你应该能够捕获异常 - 寻找actionPerformed
方法。
public void actionPerformed(ActionEvent e) {
try{
// your logic here
}
catch(Exception e){
// do something to handle the exception here
}
}
编辑(回复评论):
如果您想在一个地方处理所有未捕获的异常,您可以执行以下操作:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
System.out.println("Caught exception: "+e.getClass().getName());
// do something else useful here
}
});
您可以将该代码放在main方法中。