为什么不能检测到JavascriptObject的运行时空指针?

时间:2012-04-09 07:31:19

标签: gwt nullpointerexception javascript-objects

经过一些调试后,我发现“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。

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

1 个答案:

答案 0 :(得分:2)

编译器执行许多优化以将GWT / Java转换为Javascript。

  • 类型和方法是最终的 - 这允许后面的步骤理解需要正常分派哪些方法,哪些方法可以是静态的,只需调用单个实现。
  • 在可能的情况下,方法是静态的,允许方法内联
  • 在可能和合理的情况下,方法是内联的

那说...当我编译你的样本时,onModuleLoad()的主体被优化到这个:

null.nullMethod();

这是GWT编译器说“这将永远不会工作”的方式 - 它注意到该值始终为null,因此无法在其上调用该方法。但是在开发模式下,显然空对象指向JavaScript中的window对象。这是在http://code.google.com/p/google-web-toolkit/issues/detail?id=6625在GWT项目中提交的。

如果您需要确保不对null执行操作,请在调用方法之前测试null - 如果在像您这样的测试中,该值始终为null,则会优化它。运行时异常不应该用于控制代码,所以你不应该依赖NullPointerException来代码中做任何事情。