(下面的示例代码是独立且可运行的,您可以尝试一下,它不会使您的系统崩溃:)
Tom Hawtin 在这里评论了这个问题:Why do people run Java GUI's on the Event Queue
那:
EDT 不太可能崩溃。在 EDT 调度中抛出的未经检查的异常被捕获、转储并且线程继续。
有人可以解释一下这里发生了什么(每次单击“抛出未经检查的异常”按钮时,都会故意除以零):
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class CrashEDT extends JFrame {
public static void main(String[] args) {
final CrashEDT frame = new CrashEDT();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing( WindowEvent e) {
System.exit(0);
}
});
final JButton jb = new JButton( "throw an unchecked exception" );
jb.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
System.out.println( "Thread ID:" + Thread.currentThread().getId() );
System.out.println( 0 / Math.abs(0) );
}
} );
frame.add( jb );
frame.setSize(300, 150);
frame.setVisible(true);
}
}
我收到以下消息(这是我所期望的):
Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException: / by zero
对我来说,这是一个未经检查的例外,对吧?
您可以看到每次触发崩溃时线程 ID 都会增加。
那么,EDT 是否会在每次引发未经检查的异常时自动重新启动,或者像 Tom Hawtin 评论的那样,未经检查的异常“被捕获、转储并且线程继续” ?
这里发生了什么?