2013-12-14 2 views
1

Я простаиваю в течение нескольких часов на этой простой реализации GWT SimpleEventbus.Nullpointer [Umbrella] Исключение при запуске GWT SimpleEventBus Event от Singleton

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

Я использую 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 

EntriesReceiveEvent.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. This site однако доказал, что мои проблемы ошибаются.

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

Благодарим за помощь!

ответ

3

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

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

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

+0

Awesome! Вот и все! Я знал, что функция, вызываемая в обработчике событий, еще не стабильна, но я не считаю это проблемой. Я хотел сначала запустить Eventbus ... Большое спасибо! Я не знал о значении исключения Umbrealla. Для тех, кто не знает об этом тоже: http://stackoverflow.com/questions/8362613/why-does-umbrellaexception-have-that-name – Patrick