1

我有一个最近集成到另一个 Java 软件(我将称之为“外部”软件)中的 Java 软件。我们使用侦听器和回调机制在两个软件之间进行“通信”。

“外部”软件的创建者说,由于我的代码中存在一些 EDT 违规,他们得到了 NullPointerException。可以吗?

4

1 回答 1

4

如果这些组件以某种方式与 Swing 组件交互(例如,它们作为侦听器附加到组件上),那么违反 EDT 肯定会导致这样的行为。当然,您可以反过来询问他们是否对这些方法有断言,如果启用断言,代码是否会清楚地显示违反 EDT 规则的位置。

编辑(回应评论):

EDT 的基本经验法则是,每当您启动一个新线程时,如果不将该代码包装在 Runnable 中并调用 SwingUtilities.invokeLater(Runnable )。这需要纪律和一些额外的设计工作,但在任何严肃的应用程序中绝对是必要的。

如果您在同步行为上投入了大量资金(例如弹出对话框并等待答案),您可以调用 SwingUtilities.invokeAndWait(Runnable),但您应该尽量避免这样做。另外,请确保您不在EDT 上时调用该方法,否则它将不起作用。

开始控制此类代码的一种方法是使用如下断言:

   assert (EventQueue.isDispatchThread())

无论您有任何代码触及 GUI 并在启用断言的情况下运行。这样,您将看到错误地接触 Swing 组件的确切代码路径。

于 2010-04-27T23:40:42.943 回答