小编典典

引发异常时,EDT是否重新启动?

java

(下面的示例代码是独立且可运行的,您可以尝试一下,它不会使系统崩溃:)

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所评论的那样?

这里发生了什么?


阅读 233

收藏
2020-09-26

共1个答案

小编典典

作为参考,“
此机制的特定行为取决于实现。”
例如,线程ID在我的平台上保持不变。在
AWT线程问题中
讨论的最终结果是,“当存在至少一个可显示组件时,JVM将不会退出”。

2020-09-26