【问题标题】:Is it safe to dispose a JDialog in a try block, and then continue executing code in a matching finally block?在 try 块中处理 JDialog 是否安全,然后在匹配的 finally 块中继续执行代码?
【发布时间】:2014-03-27 14:07:36
【问题描述】:

我已经尝试四处寻找这个问题,我想它一定是在某个时候被问到的,但这是我能找到的最接近的东西 Remove Top-Level Container on Runtime

我的问题是,在 JDialog 中调用 dispose() 之后,如果 dispose 在 try 中完成并且执行代码在 finally 中完成,那么在 JDialog 中执行代码是否安全?

这里有一个例子来说明我在问什么:

import java.awt.EventQueue;
import javax.swing.JDialog;

public class DisposeTestDialog extends JDialog {
    private final String somethingToPrint;

    public DisposeTestDialog(String somethingToPrint) {
        this.somethingToPrint = somethingToPrint;
    }

    public void showAndDispose() {
        setVisible(true);
        // Do something
        setVisible(false);
        try {
            dispose();
        }
        finally {
            System.out.println(somethingToPrint);
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                DisposeTestDialog dialog = new DisposeTestDialog("Can this be safely printed?");
                dialog.showAndDispose();
            }

        });
    }
}

根据我对dispose() 进程和finally 块的了解,我认为它应该可以正常工作,即使不是一个好主意。确实运行上述代码确实成功打印。

是否有可能在 try/finally 之间启动 GC 并导致一些问题?

【问题讨论】:

  • 如果您需要让您的类持久化,请不要扩展 JDialog。使用 JDialog。仅当您想要覆盖组件方法之一时才扩展 Swing 组件。
  • @GilbertLeBlanc 是的,这实际上仅适用于此示例。我的实际用例大不相同。

标签: java swing dispose jdialog try-finally


【解决方案1】:

不,只要您仅访问示例中的字符串等非图形对象。

【讨论】:

  • 所以你的意思是,只要我不做一些会访问部分 Dialog 框架的事情,那么我应该没问题?
猜你喜欢
  • 2014-07-15
  • 2012-02-07
  • 2012-01-26
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2017-09-20
  • 2021-05-13
  • 1970-01-01
相关资源
最近更新 更多