(下面的示例代码是独立且可运行的,您可以尝试一下,它不会使系统崩溃:)
Tom Hawtin在这里评论了这个问题:为什么人们在事件队列上运行JavaGUI
那:
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所评论的那样?
这里发生了什么?
作为参考,“ 此机制的特定行为取决于实现。” 例如,线程ID在我的平台上保持不变。在 AWT线程问题中 讨论的最终结果是,“当存在至少一个可显示组件时,JVM将不会退出”。