我有一个最近集成到另一个 Java 软件(我将称之为“外部”软件)中的 Java 软件。我们使用侦听器和回调机制在两个软件之间进行“通信”。
“外部”软件的创建者说,由于我的代码中存在一些 EDT 违规,他们得到了 NullPointerException。可以吗?
我有一个最近集成到另一个 Java 软件(我将称之为“外部”软件)中的 Java 软件。我们使用侦听器和回调机制在两个软件之间进行“通信”。
“外部”软件的创建者说,由于我的代码中存在一些 EDT 违规,他们得到了 NullPointerException。可以吗?
如果这些组件以某种方式与 Swing 组件交互(例如,它们作为侦听器附加到组件上),那么违反 EDT 肯定会导致这样的行为。当然,您可以反过来询问他们是否对这些方法有断言,如果启用断言,代码是否会清楚地显示违反 EDT 规则的位置。
编辑(回应评论):
EDT 的基本经验法则是,每当您启动一个新线程时,如果不将该代码包装在 Runnable 中并调用 SwingUtilities.invokeLater(Runnable )。这需要纪律和一些额外的设计工作,但在任何严肃的应用程序中绝对是必要的。
如果您在同步行为上投入了大量资金(例如弹出对话框并等待答案),您可以调用 SwingUtilities.invokeAndWait(Runnable),但您应该尽量避免这样做。另外,请确保您不在EDT 上时调用该方法,否则它将不起作用。
开始控制此类代码的一种方法是使用如下断言:
assert (EventQueue.isDispatchThread())
无论您有任何代码触及 GUI 并在启用断言的情况下运行。这样,您将看到错误地接触 Swing 组件的确切代码路径。