PropertyTester中的ConcurrentModificationException

时间:2017-11-23 08:11:00

标签: java eclipse-plugin e4

我有一个PropertyTester通过主工具栏上的visibleWhen调用,在应用程序启动时抛出以下异常:

java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarContributionRecord.updateVisibility(ToolBarContributionRecord.java:70)
at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer$5.changed(ToolBarManagerRenderer.java:479)
at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:114)
at org.eclipse.e4.core.internal.contexts.EclipseContext.runAndTrack(EclipseContext.java:324)
at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer.processAddition(ToolBarManagerRenderer.java:471)
at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer.generateContributions(ToolBarManagerRenderer.java:447)
at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer.processContribution(ToolBarManagerRenderer.java:413)

我真的认为E4应该能够应对工具项目"突然之间#34;消失。此外,由于所讨论的属性测试器ALWAYS返回false,因此工具项甚至在开始时都不可见。

我可以将异常跟踪到以下行(请记住,导致异常的属性测试器甚至不存在于堆栈跟踪中):

PlatformUI.getWorkbench().getActiveWorkbenchWindow()

如果我在test(...)的{​​{1}}方法中添加该行,则会发生异常。如果我删除它不会。因此,显示错误的最小示例是:

PropertyTester

我绝对难以理解为什么会发生这种异常,以及如何防止它发生。 public final class MyPropertyTester extends PropertyTester { @Override public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { PlatformUI.getWorkbench().getActiveWorkbenchWindow(); return false; } } 永远不会返回null或抛出异常。 getActiveWorkbenchWindow()也没有返回true,即使我的猜测是在发生错误时仍然会运行某种初始化。

(注意:除了非常丑陋之外,该异常不会影响应用程序的工作方式。)

如何防止此异常?

1 个答案:

答案 0 :(得分:0)

添加PropertyTester测试方法中的第一行,如

if (!(receiver instanceof IEditorPart)) return false;

避免执行注定要失败的代码并使用receiver来计算返回值。

请参阅: