Nullpointer[Umbrella]Исключение при запуске события GWT SimpleEventBus из Singleton

Я часами застрял на этой простой реализации GWT SimpleEventbus.

Что-то не так с этой настройкой? Что может быть причиной этого?

Я использую web.binderyEventbus

import com.google.web.bindery.event.shared.SimpleEventBus;

Eventbus инициализируется в моем классе Entrypoint.

public void onModuleLoad() {

    ApplicationEvents = new SimpleEventBus();

Затем он вводится в Singleton LoadData и в MainView (класс UIBinder без MVP).

    LoadData.initLoadData(ApplicationEvents);
    view = new MainView(ApplicationEvents);

initLoadData в основном является псевдонимом для конструктора, за исключением того, что он ничего не возвращает.

public class LoadData {

    private final SimpleEventBus eventBus;

    private LoadData(final SimpleEventBus bus) {
        eventBus = bus;
        ...
    }

    public static void initLoadData(final SimpleEventBus bus){ 
        if (instance == null){
            instance = new LoadData(bus);
        }
    }

Eventbus внедряется в MainView следующим образом.

public class MainView extends Composite {

    private final SimpleEventBus eventbus;

    public MainView(final SimpleEventBus bus) {
        eventbus = bus;
        ...

Затем регистрируется обработчик.

        eventbus.addHandler(EntriesReceiveEvent.TYPE, new EntriesReceiveEventHandler() {
            @Override
            public void onEntriesReceive(EntriesReceiveEvent event) {
            ...
            }
        });

И в конце метода у меня вызывается метод в LoadData.

        LoadData.getLoadData().fetchYears(); //alias for loadIndex

Метод loadIndex в LoadData.java

        private void loadIndex() {
                System.out.println(eventBus.toString());
                if(indexEntries == null){
                    AsyncCallback..
                    public void onSuccess(Map<Short, IndexEntry> result) {
                        eventBus.fireEvent(new EntriesReceiveEvent());
                        //^^ LoadData.java:190

ЗаписиReceiveEvent.java

import com.google.gwt.event.shared.GwtEvent;

public class EntriesReceiveEvent extends GwtEvent<EntriesReceiveEventHandler> {

      public static Type<EntriesReceiveEventHandler> TYPE = 
              new Type<EntriesReceiveEventHandler>();

    @Override
    public Type<EntriesReceiveEventHandler> getAssociatedType() {
        return TYPE;
    }

    @Override
    protected void dispatch(EntriesReceiveEventHandler handler) {
        handler.onEntriesReceive(this);
    }
}

И это обработчик EntriesReceiveEventHandler.java

import com.google.gwt.event.shared.EventHandler;

public interface EntriesReceiveEventHandler extends EventHandler {

    void onEntriesReceive(EntriesReceiveEvent event);
}

Наконец Исключение.

11:36:57.417 [ERROR] [] Uncaught exception escaped

com.google.web.bindery.event.shared.UmbrellaException: Exception caught: null
at com.google.web.bindery.event.shared.SimpleEventBus.doFire(SimpleEventBus.java:203)
at com.google.web.bindery.event.shared.SimpleEventBus.fireEvent(SimpleEventBus.java:88)
at com.SoftwareEngineering.client.LoadData$2.onSuccess(LoadData.java:190)
at com.SoftwareEngineering.client.LoadData$2.onSuccess(LoadData.java:1)
at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:232)
at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:258)
at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:412)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:338)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:242)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
at java.lang.Thread.run(Unknown Source)

Я подумал, что Eventbus может быть другим, поскольку я не знал, все ли они общаются с одной и той же Eventbus. Этот сайт однако доказал, что мои опасения были ошибочными.

Дополнительный вопрос: считаете ли вы синглтон в этом контексте плохим? Это довольно небольшой проект, и LoadData, который обрабатывает все запросы RPC, должен быть доступен глобально.

Спасибо за любую помощь!


person Patrick    schedule 14.12.2013    source источник


Ответы (1)


NPE, который у вас есть, заключен в исключение Umbrella. Это означает, что один из обработчиков событий фактически выдал исключение. Стандартная процедура в этом случае состоит в том, чтобы продолжать вызывать остальные обработчики, а затем генерировать зонтичное исключение, содержащее все ошибки, которые произошли во время срабатывания.

Чтобы прочитать настоящее исключение, продолжайте свой путь вверх по стеку — прочитайте остальную часть журнала после того, где это произошло, и посмотрите, что произошло в обработчике (возможно, в вашем собственном коде обработчика событий или в каком-то коде). который вызывает ваш обработчик).

Еще один способ разобраться в таких проблемах: используйте отладчик вашей IDE и установите точку останова на все сгенерированные исключения NullPointerException. Это приостановит отладчик в тот момент, когда произойдет NPE, чтобы вы могли сразу увидеть его, вместо того, чтобы копаться в журналах.

person Colin Alworth    schedule 14.12.2013
comment
Потрясающий! Вот оно! Я знал, что функция, вызываемая в обработчике событий, еще не стабильна, но я не считал это проблемой. Я хотел сначала запустить Eventbus... Большое спасибо! Я не знал о значении исключения UmbrelaException. Для тех, кто об этом тоже не знает: stackoverflow. ком/вопросы/8362613/ - person Patrick; 14.12.2013