【问题标题】:ConcurrentModificationException in PropertyTesterPropertyTester 中的 ConcurrentModificationException
【发布时间】: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()

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

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() or asyncExec() 包裹,也会抛出ConcurrentModificationException
  • @howlger 对于syncExec(),它仍然会被抛出。使用asyncExec() 一切正常,因为代码只有在工作台初始化后才会执行,但这对PropertyTester 并没有真正的帮助。
  • 打算在 UI 线程中执行的代码在 PropertyTester 中没有意义。不要混合模型和 UI。
  • @howlger 但是如何根据 UI 状态启用命令?在此示例中,我想启用基于 IEditorInput 字段的工具项。
  • 为什么不直接使用org.eclipse.ui.ide.editorInputTester(见code - extension)?

标签: java eclipse-plugin e4


【解决方案1】:

PropertyTester的测试方法的第一行添加类似

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

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

见:

【讨论】:

  • 我复制了EditorInputPropertyTester 及其注册(来自plugin.xml),然后将其连接到我的命令。不调用属性测试器。也许这是在 E4 崩溃期间丢失的功能之一?
  • 可能由于 3.x 和 4.x 的开发人员太少,Eclipse 4.x 发布得太早了。没有调用属性测试器不是 e4 的错,而是您的 RCP 应用程序的错。
  • 很公平。你如何手动调用属性测试器?在 E3 中调用 IEvaluationService 不起作用。 (见herethere
  • 通过Eclipse 4 event system 和依赖注入。两件很酷的事情值得花时间学习。 ;)
  • 即使当我调用IEventBroker#post 时,test 方法仍然没有被调用(不过,当java.lang.Object 被用作类型时;但是不管怎样都会调用它,问题的例外是抛出)。
猜你喜欢
  • 2017-09-25
  • 2015-09-23
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多