Java 处理中的NPE贡献率。canExecuteItem

Java 处理中的NPE贡献率。canExecuteItem,java,eclipse-plugin,e4,Java,Eclipse Plugin,E4,我有一个带工具栏的小编辑器,由plugin.xml提供: 公共类MyEditor扩展了EditorPart{ 公共静态最终字符串ID=“org.acme.project.MyEditor”; @凌驾 public void init(IEditorSite站点,IEditorInput输入)引发PartInItemException{ 固定位置(现场); 设置输入(输入); } @凌驾 公共void createPartControl(复合父级){ 最终工具栏管理器localToolBarman

我有一个带工具栏的小编辑器,由plugin.xml提供:

公共类MyEditor扩展了EditorPart{
公共静态最终字符串ID=“org.acme.project.MyEditor”;
@凌驾
public void init(IEditorSite站点,IEditorInput输入)引发PartInItemException{
固定位置(现场);
设置输入(输入);
}
@凌驾
公共void createPartControl(复合父级){
最终工具栏管理器localToolBarmanager=新工具栏管理器();
最终IMenuService menuService=PlatformUI.getWorkbench().getService(IMenuService.class);
menuService.populateContributionManager(localToolBarmanager,“toolbar:org.acme.menu”);
localToolBarmanager.createControl(父级);
}
}
当然,我的plugin.xml有一个贡献:


编辑器打开,工具栏被激活,一切正常。当我关闭打开编辑器时处于活动状态的工作台部件时,会出现以下异常:

!ENTRY org.eclipse.e4.ui.workbench.renderers.swt 4 2 2017-10-30 15:12:53.110
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.renderers.swt".
!STACK 0
java.lang.NullPointerException
    at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.canExecuteItem(HandledContributionItem.java:443)
    at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem$4.run(AbstractContributionItem.java:524)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem.updateItemEnablement(AbstractContributionItem.java:564)
    at org.eclipse.e4.ui.workbench.renderers.swt.ToolItemUpdater.updateContributionItems(ToolItemUpdater.java:36)
    at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer.subscribeTopicUpdateToolbarEnablement(ToolBarManagerRenderer.java:295)
    at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
    at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler$1.run(UIEventObjectSupplier.java:56)
    at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827)
这是唯一有焦点的部分。我可以很好地关闭其他部分。此异常会导致工具栏中的处理程序被破坏,工具栏不再工作

我发现了一些bug,但有一个例外:&

但是这些应该在4.2中修复(我们使用的是4.6)。除此之外,我找不到任何可能导致这种奇怪错误消息的东西


有人知道如何修复我们的工具栏吗?

这是最愚蠢的E4错误之一。可能是我们的前三名

workbenchmentuservice.populateContributionManager(ContributionManager,String)
使用当前活动的工作台部件注册菜单。由于工具栏通常是在
IWorkbenchPart.createPartControl(Composite)
中创建的,这意味着新零件尚未完全创建,也未创建活动零件

因此工具栏不再适用于所有视图和编辑器

我找到了一个解决办法(这真的很难看,但你打算怎么做?)来修复这个巨大的E4错误。对
populateContributionManager
的调用必须替换为以下行:

    final MPart part = getSite().getService(MPart.class);
    String menuLocation = "toolbar:org.acme.menu";

    if (menuService instanceof WorkbenchMenuService) {
        ((WorkbenchMenuService) menuService).populateContributionManager(part, manager, menuLocation);
    } else if (menuService instanceof SlaveMenuService) {
        ((SlaveMenuService) menuService).populateContributionManager(part, manager, menuLocation);
    } else
        throw new UnsupportedOperationException("Do not know how to handle " + menuService); //$NON-NLS-1$