【发布时间】:2017-11-23 08:11:00
【问题描述】:
我有一个通过主工具栏上的visibleWhen 调用的PropertyTester,在应用程序启动时抛出以下异常:
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 应该能够应对“突然”消失的工具项。此外,由于所讨论的属性测试器总是返回 false,因此该工具项甚至一开始都不可见。
我可以将异常跟踪到以下行(请记住,导致异常的属性测试器甚至不存在于堆栈跟踪中):
PlatformUI.getWorkbench().getActiveWorkbenchWindow()
如果我在PropertyTester 的test(...) 方法中添加该行,则会发生异常。如果我删除它,它不会。因此,显示该错误的最小示例是:
public final class MyPropertyTester extends PropertyTester {
@Override
public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
PlatformUI.getWorkbench().getActiveWorkbenchWindow();
return false;
}
}
我完全不知道为什么会发生这种异常,以及我如何才能防止它发生。 getActiveWorkbenchWindow() 从不返回 null 或抛出异常。 IWorkbench#isStarting 也不会返回 true,尽管我猜测错误发生时仍然有某种初始化在运行。
(注意:除了真的很丑之外,异常不会影响应用程序的工作方式。)
如何防止这个异常?
【问题讨论】:
-
如果
PlatformUI.getWorkbench().getActiveWorkbenchWindow();被syncExec()orasyncExec()包裹,也会抛出ConcurrentModificationException? -
@howlger 对于
syncExec(),它仍然会被抛出。使用asyncExec()一切正常,因为代码只有在工作台初始化后才会执行,但这对PropertyTester并没有真正的帮助。 -
打算在 UI 线程中执行的代码在
PropertyTester中没有意义。不要混合模型和 UI。 -
@howlger 但是如何根据 UI 状态启用命令?在此示例中,我想启用基于
IEditorInput字段的工具项。
标签: java eclipse-plugin e4