(下面的示例代码是自包含的,可运行的,你可以尝试,它不会造成系统崩溃:)当引发异常时,EDT是否重新启动?
汤姆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是一个好的表达式,并且还会抛出异常。 [阅读更多...](http:// stackoverflow。com/questions/2934063/is-1-0-a-legal-java-expression) – aioobe 2010-06-11 07:28:52
@aioobe:他他,我知道,我知道,我已经读过那个讨论......但是如果写了0/0或1/0,那么人们会问这是甚至编译:) – NoozNooz42 2010-06-11 07:37:35
hahaha ...好点:-) – aioobe 2010-06-11 07:39:01