(mã ví dụ dưới đây là khép kín và Runnable, bạn có thể thử nó, nó sẽ không sụp đổ hệ thống của bạn :)Liệu EDT có khởi động lại hay không khi một ngoại lệ được ném ra?
Tom Hawtin nhận xét về vấn đề ở đây: Why do people run Java GUI's on the Event Queue
rằng:
Rất có thể EDT sẽ không hoạt động. Các trường hợp ngoại lệ không được kiểm tra được ném trong công văn EDT bị bắt, bán phá giá và chuỗi tiếp tục.
Ai đó có thể giải thích cho tôi những gì đang xảy ra ở đây (mỗi khi bạn click vào "ném một ngoại lệ được kiểm soát" nút, một chia cho số không được thực hiện, về mục đích):
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);
}
}
tôi nhận được thông báo sau (đó là những gì tôi mong đợi):
Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException:/by zero
và với tôi đây là một ngoại lệ không được kiểm soát phải không?
Bạn có thể thấy rằng ID luồng đang được tăng lên mỗi khi bạn kích hoạt sự cố.
Vì vậy, EDT tự động khởi động lại mỗi lần ngoại lệ không được kiểm soát được ném hoặc không được kiểm tra ngoại lệ "bị bắt, bán phá giá và chuỗi tiếp tục" như Tom Hawtin đã nhận xét?
Điều gì đang xảy ra ở đây?
Một lưu ý thú vị về một vấn đề hoàn toàn khác: Bạn không phải làm Math.abs (0) để "lừa" trình biên dịch chấp nhận nó. 0/0 là một biểu thức ok và cũng sẽ ném ngoại lệ. [đọc thêm ...] (http: // stackoverflow.com/questions/2934063/is-1-0-a-legal-java-expression) – aioobe
@aioobe: anh ấy, tôi biết, tôi biết, tôi đã đọc cuộc thảo luận đó ... Nhưng nếu đã viết 0/0 hoặc 1/0 sau đó mọi người sẽ hỏi rằng điều đó thậm chí còn biên dịch :) – NoozNooz42
hahaha ... tốt điểm :-) – aioobe