当前位置: 首页 > 面试题库 >

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

劳鹏云
2023-03-14
问题内容

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

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将不会退出”。



 类似资料:
  • System.ObjectDisposedException:无法访问已释放的对象。对象名称:“System.net.Sockets.NetworkStream”。在system.net.sockets.networkstream.read(Byte[]缓冲区,Int32偏移量,Int32大小) 我的问题是我做错了什么?以及重新连接到服务器的最佳解决方案是什么?我的代码如下所示:

  • 我对从JBPM工作项处理程序抛出异常并在业务流程的其他地方处理异常的主题有点困惑。我们使用JBPM 6.0.3在Jboss EAP 6.1中运行。 JBPM用户指南暗示您永远不应该从WorkItemHandler中抛出异常。相反,处理程序应该捕获它们并以某种方式处理它们,或者将它们转换为错误消息、信号或类似信息。JBPM甚至提供了工作项处理程序包装器,用于捕获信号并将它们转换为消息。用户指南中没有

  • 问题内容: 我想知道只有Integer.parseInt(无论如何)都不会失败的情况下才能做些什么。 更具体地说,我有一个jTextArea用户指定值,由换行符分隔。 我想检查每一行,看看是否可以转换为整数。 想出了类似的东西,但是不起作用: 任何帮助表示赞赏。 问题答案:

  • 问题内容: 有谁知道是否存在可以测试被测代码中是否抛出异常的或类似东西? 问题答案:

  • 很难可靠地重试后台任务,该任务会向邮件服务发送请求,以获取最新的电子邮件。一旦成功接收电子邮件,应在阻止-持久化电子邮件中继续执行,但是如果出现异常,我必须重新运行邮件检索,直到成功尝试,成功后应持久化邮件并停止。如果我做错了,请看一看并提出建议。 另外,请看一下我是如何处理选中的异常的,将其包装到中并重新排序-这里的主要思想是在一个块中处理所有异常(已定义的选中异常和运行时异常),而不是将它们记

  • 你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 如何引发异常 例13.2 如何引发异常 #!/usr/bin/python # Filename: raising.py classShortInputException(Exception):     '''A u