2012-04-09 64 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在代码中执行任何操作。

相关问题