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?的主要内容,如果未能解决你的问题,请参考以下文章
检查模板中是不是存在变量,如果不存在则不会在记录器中导致错误