NullpointerException в IDEWorkbenchAdvisor во время Workbench.close () в earlyStartup () собственного плагина - PullRequest
0 голосов
/ 09 мая 2019

В настоящее время я пишу собственный плагин Eclipse, который должен работать в фоновом режиме и закрываться, если в системе появляется файл.

Я использовал расширение org.eclipse.ui.startup, и я жду, пока workbench.isStarting () станет ложным. Но когда я вызываю workbench.close (), я получаю исключение NullPointerException

Текущий код:

public class Startup1 implements IStartup {

    @Override
    public void earlyStartup() {


        File file = new File("c:\\closeworkbench");

        while(!file.exists()) {
            try {
                Thread.sleep(2000);

            } catch (InterruptedException e) {

            }
        }


        IWorkbench workbench = PlatformUI.getWorkbench();
        while(workbench.isStarting())
        {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }



        }
        workbench.close();

    }

}

А вот и исключение NullpointerException.

!SESSION 2019-05-09 10:13:29.634 -----------------------------------------------
eclipse.buildId=4.11.0.I20190307-0500
java.version=1.8.0_181
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=de_DE
Framework arguments:  -product org.eclipse.platform.ide
Command-line arguments:  -product org.eclipse.platform.ide -data C:\plugindevworkspace/../runtime-EclipseApplication -dev file:C:/plugindevworkspace/.metadata/.plugins/org.eclipse.pde.core/Eclipse Application/dev.properties -os win32 -ws win32 -arch x86_64 -consoleLog

!ENTRY org.eclipse.egit.core 1 0 2019-05-09 10:13:33.541
!MESSAGE Using Apache MINA sshd as ssh client.
log4j:WARN No appenders could be found for logger (org.eclipse.buildship.core.internal.util.gradle.PublishedGradleVersions).
log4j:WARN Please initialize the log4j system properly.

!ENTRY org.eclipse.egit.ui 2 0 2019-05-09 10:13:38.118
!MESSAGE Warning: The environment variable HOME is not set. The following directory will be used to store the Git
user global configuration and to define the default location to store repositories: 'Y:\'. If this is
not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and
EGit might behave differently since they see different configuration options.
This warning can be switched off on the Team > Git > Confirmations and Warnings preference page.
It works
Closing workbench

!ENTRY org.eclipse.ui.workbench 4 2 2019-05-09 10:13:39.238
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui.workbench".
!STACK 0
java.lang.NullPointerException
    at org.eclipse.ui.internal.ide.application.IDEWorkbenchAdvisor.preShutdown(IDEWorkbenchAdvisor.java:369)
    at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1078)
    at org.eclipse.ui.internal.Workbench.lambda$4(Workbench.java:1413)
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:55)
    at org.eclipse.ui.internal.Workbench.close(Workbench.java:1413)
    at org.eclipse.ui.internal.Workbench.close(Workbench.java:1386)
    at de.pds.autoshutdown.Startup1.earlyStartup(Startup1.java:50)
    at org.eclipse.ui.internal.EarlyStartupRunnable.runEarlyStartup(EarlyStartupRunnable.java:80)
    at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:56)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
    at org.eclipse.ui.internal.Workbench$39.run(Workbench.java:2707)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

!ENTRY org.eclipse.ui 4 0 2019-05-09 10:13:39.240
!MESSAGE Unable to execute early startup code for the org.eclipse.ui.IStartup extension contributed by the 'de.pds.autoshutdown' plug-in.
!STACK 0
java.lang.NullPointerException
    at org.eclipse.ui.internal.ide.application.IDEWorkbenchAdvisor.preShutdown(IDEWorkbenchAdvisor.java:369)
    at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1078)
    at org.eclipse.ui.internal.Workbench.lambda$4(Workbench.java:1413)
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:55)
    at org.eclipse.ui.internal.Workbench.close(Workbench.java:1413)
    at org.eclipse.ui.internal.Workbench.close(Workbench.java:1386)
    at de.pds.autoshutdown.Startup1.earlyStartup(Startup1.java:50)
    at org.eclipse.ui.internal.EarlyStartupRunnable.runEarlyStartup(EarlyStartupRunnable.java:80)
    at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:56)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
    at org.eclipse.ui.internal.Workbench$39.run(Workbench.java:2707)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

У вас есть идеи?

1 Ответ

1 голос
/ 09 мая 2019

Метод earlyStartup не выполняется в потоке пользовательского интерфейса. Но метод IDEWorkbenchAdvisor.preShutdown, вызываемый IWorkbench.close, ожидает выполнения в потоке пользовательского интерфейса, поскольку он вызывает Display.getCurrent, который работает только в потоке пользовательского интерфейса.

Вы можете попробовать использовать Display.asyncExec, чтобы как можно скорее запустить закрытие в потоке пользовательского интерфейса:

Display.getDefault().asyncExec(() -> workbench.close());

Однако я не уверен, что такие вещи, как IWorkbench.isStarted, являются потокобезопасными, поэтому то, что вы пытаетесь сделать, может быть ненадежным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...