【发布时间】:2016-01-14 03:38:17
【问题描述】:
(下面的示例代码是独立且可运行的,你可以试试,它不会让你的系统崩溃:)
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 评论的那样?
这是怎么回事?
【问题讨论】:
-
关于完全不同的问题的一个有趣的旁注:您不必执行 Math.abs(0) 来“欺骗”编译器来接受它。 0/0 是一个好的表达式,也会抛出异常。 read more...
-
@aioobe:嘿嘿,我知道,我知道,我读过那个讨论......但如果写成 0/0 或 1/0,那么人们会问它是什编译:)
-
哈哈哈...好点 :-)
-
看
EventDispatchThread.pumpOneEventForFilters,在当前的实现中“很复杂”。显然,不同的实现可能会有所不同。在没有实现的窗口时 EDT 退出之前,可能总是会捕获异常。
标签: java exception event-dispatch-thread