2012-04-09 61 views
0

經過一些調試之後,我發現「com.google.gwt.event.shared.UmbrellaException:One或 捕獲了更多異常,請在調用方法時查看UmbrellaException#getCauses中的完整集:[nsIDOMEventListener :: handleEvent]」(在web模型)是由運行時空指針引起的。問題是爲什麼這種運行時空指針異常沒有在主機模型下拋出。實際上,打擊代碼不會拋出任何異常,甚至在我的筆記本電腦中出現警告彈出窗口(gwt 2.4 + java 7 64bit + ubuntu 12.04 64bit + eclipse 3.7)。任何人都知道如何強制eclipse拋出異常,每當JavaScriptObject指針發生運行時null。爲什麼不能檢測到JavascriptObject的運行時空指針?

public class GWTTest implements EntryPoint 
{ 
    public static class JsObj extends JavaScriptObject 
    { 
     protected JsObj() 
     { 
     } 

     public final native void setValue(String Value)/*-{ 
       this.Value=Value; 
       alert(Value); 
     }-*/; 
    } 

    public void onModuleLoad() 
    { 
     JsObj jsObj = null; 
     jsObj.setValue("val"); 
    } 
} 

回答

2

編譯器執行一些優化到GWT /爪哇變換成JavaScript。

  • 類型和方法是最終的 - 這允許後面的步驟瞭解哪些方法需要正常調度,哪些方法可以是靜態的,只需調用單個實現。
  • 方法是由靜態的,如果可能的話,它允許方法被內聯
  • 在可能和合理的,方法是內聯的

不過......當我編譯你的樣品,onModuleLoad的身體( )被優化掉了這個:

null.nullMethod(); 

這是說「這行不通」的GWT編譯器的方式 - 它注意到值始終是空的,所以該方法不能它被調用。但在Dev模式下,顯然空對象留在JavaScript中的window對象上。這是GWT項目中的http://code.google.com/p/google-web-toolkit/issues/detail?id=6625

如果您需要確保不要對null執行操作,請在調用方法之前測試null - 如果在像您這樣的測試中,該值始終爲null,則會進行優化。運行時異常不應該用於控制代碼,所以你不應該依賴NullPointerException在代碼中執行任何操作。