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

在javax.swing应用程序中捕获异常

阎经武
2023-03-14
问题内容

我正在与javax.swing一个应用程序一起工作,该应用程序从XML
Schema生成表单(使用JAXFront库),并将用户填写的数据存储到XML文档中。

我在需要时放置了try-catch-finally块,但是在主线程结束时(AWT线程仍在运行)捕获异常时我有一个小问题。

我有两个班级负责主要工作,其他班级对这个问题并不重要:

  • 主类 :具有以下结构。初始化应用程序并运行主机

    public class Main { 
    public static void main(String[] args) {
        readArgs(); // An INI file with the app config
        Model model = initializeElements(args); // My model class
        try {
            MyFrame mfr = new MyFrame(title,model);
            mfr.visualize(); // Assembling view and setting visible
        } catch( Excepion e ) {
            doCleanUp();
            System.exit(-1);
        }
    }
    

    }

  • 框架类 :生成视图和监听事件

    public class MyFrame extends JFrame implements ActionListener,MenuListener { 
    // Some attributes
    // Other mthods without importance
    /**
     * Compose the elements, add listeners and set visible the frame
     */
    public void visualize() {
        generateFormPanel();
        setListeners();
        validate();
        setVisible(true);
    }
    
    public MyFrame(String title, Modele model) {
        super(title);
        createElementsUsing(model);
    }
    
    public void actionPerformed(ActionEvent e) {
        // Code to manage events
    }
    

    }

好了,问题就出在下面:从主要方法中提取可视化功能时,将生成并显示视图。那时候我失去了对异常捕获的控制。然后我的问题是,是否
有某种方法可以捕获在此之后引发的可能的RuntimeException

希望您能理解我的英语,并能回答这个问题。

提前致谢。


问题答案:

最简单的版本是设置默认的未捕获异常处理程序:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    public void uncaughtException(Thread t, Throwable e) {
        // do something
    }
});

但这也捕获了程序其他部分抛出的未捕获异常。

但是,您可以使用代理仅捕获从swing事件调度线程抛出的运行时异常(有关更多信息,请参见此页,从那里复制代码):

class EventQueueProxy extends EventQueue {

    protected void dispatchEvent(AWTEvent newEvent) {
        try {
            super.dispatchEvent(newEvent);
        } catch (Throwable t) {
            // do something more useful than: t.printStackTrace();
        }
    }
}

现在像这样安装它:

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueueProxy());


 类似资料:
  • 我在运行python flask web应用程序时得到了这个回溯(最近一次调用是最后一次)。 从烧瓶导入烧瓶app=烧瓶(名称) @app.route ("/") def你好():返回" 我正在终端上运行服务器:“cd Flask\u Blog”,“export Flask\u DEBUG=1” 我也尝试初始化烧瓶模块分配"flask.init()"代码,但我仍然得到错误的网页浏览器! 我做错什么

  • 我想使用sentry跟踪spring boot应用程序的异常。Sentry不会自动捕获异常。但是当我使用

  • 我有一些下面这样的代理代码。问题是,每当目标服务器停机时,此代码都无法捕获错误,导致整个应用程序崩溃,出现。 对于代理服务器来说,这很糟糕,它只需要向调用者返回一个错误,而不是在第一次无法访问目标服务器时完全崩溃。 现在什么是正确的方法? 节点版本6。 谢谢!

  • 问题内容: 如何捕捉到不同的信号,如和斯威夫特是否正确?例如,当人们通过按- 停止我的脚本时,我想在终止脚本之前进行一些清理。 问题答案: 调度源 可用于监视UNIX信号。 这是一个简单的示例,《 并发编程指南 》中“监视信号”部分中C代码的Swift 3转换 。 请注意,这需要一个活动的GCD事件循环,例如 在命令行程序中。

  • 问题内容: 如果我没记错的话,应该首先捕获Exception的子类。但是必须捕获任何RuntimeException和一个具体的经过检查的Exception,首先应该捕获它们吗? 这个命令正确吗?还是正确但错误的选择? 问题答案: 顺序是 先匹配的,然后执行 (正如JLS清楚地解释的)。 如果第一个catch匹配到异常,则执行,否则,将尝试下一个,并不断重复直到匹配或不匹配。 因此,在捕获异常时,

  • 每当我的VNC连接被终止时(每当我重新启动VM时),我都试图捕捉一个异常,并且我试图忽略它以继续我的Jython脚本。我不知道如何编写try catch语句来捕获异常,因为它起源于Java。这是一个sikuliX脚本。