EDT违规是否可能在外部软件中导致NullPointerException?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EDT违规是否可能在外部软件中导致NullPointerException?相关的知识,希望对你有一定的参考价值。

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

“外部”软件的创建者说他们得到NullPointerException,因为我的代码中有一些EDT违规。可以吗?

答案

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

编辑(回复评论):

使用EDT的基本经验法则是,无论何时启动新线程,都不要触摸任何Swing组件(或触及Swing组件的任何组件,例如Model),而不将该代码包装在Runnable中并调用SwingUtilities.invokeLater(Runnable) )。需要dicipline和一些额外的设计工作,但它在任何严肃的应用程序中肯定是必要的。

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

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

   assert (EventQueue.isDispatchThread())

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

以上是关于EDT违规是否可能在外部软件中导致NullPointerException?的主要内容,如果未能解决你的问题,请参考以下文章

检查模板中是不是存在变量,如果不存在则不会在记录器中导致错误

它会在快速的类方法中导致内存泄漏吗

在外部存储 Flyway 元数据表

如何在外部服务器上安装和使用嵌入式 C 的编译器?

SSE 移位指令在后续指令中导致奇怪的输出 (-1.#IND00)?

sql语句中导致索引失败的一些错误使用方式