2013-12-14 30 views
1

我被困在GWT SimpleEventbus的這個簡單實現上數小時。Nullpointer [傘]從Singleton發射GWT SimpleEventBus事件時發生異常

這個設置有什麼問題嗎?這可能是什麼原因?

我使用的Eventbus在我的入口點類initalized的web.binderyEventbus

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

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); 
     } 
    } 

事件總線被這樣注入到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。然而,證明我的擔憂是錯誤的。

旁邊的問題:你認爲Singleton在這方面bad?這是一個相當小的項目,處理所有RPC請求的LoadData需要全局可用。

謝謝你的幫助!

回答

3

您在那裏的NPE被封裝在Umbrella異常中。這意味着其中一個事件處理程序實際上拋出了異常。在這種情況下,標準程序是繼續調用其餘的處理程序,然後拋出包含發生時發生的所有錯誤的傘形異常。如果要讀取真正的異常,請繼續您的方式 - 從過去發生的地方讀取日誌的其餘部分,然後查看處理程序中發生的事情(可能是您自己的事件處理程序代碼或某些代碼你的處理程序調用)。

解決類似問題的另一種方法:使用IDE的調試器並在所有拋出的NullPointerExceptions上設置斷點。這會在NPE發生的瞬間暫停調試器,所以您可以馬上看到它,而不是通過日誌進行挖掘。

+0

太棒了!就是這樣!我知道在事件處理程序中調用的函數並不穩定,但我不認爲這是一個問題。我想讓Eventbus先運行...非常感謝! 我不知道UmbreallaException的含義。對於任何人不知道這一點:http://stackoverflow.com/questions/8362613/why-does-umbrellaexception-have-that-name – Patrick