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

问题描述 投票:1回答:1

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

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

java api nullpointerexception edt
1个回答
4
投票

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

编辑(回复评论):

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

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

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

   assert (EventQueue.isDispatchThread())

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

© www.soinside.com 2019 - 2024. All rights reserved.