0

经过一番调试,我发现“com.google.gwt.event.shared.UmbrellaException:一个或多个异常被捕获,请参阅 UmbrellaException#getCauses 调用方法时的完整集:[nsIDOMEventListener::handleEvent]”(在 web 模型中)是由运行时空指针引起。问题是为什么在主机模型下没有抛出这种运行时空指针异常。实际上,blow 代码不会抛出任何异常,甚至在我的笔记本电脑中弹出警报(gwt 2.4 + java 7 64bit+ubuntu 12.04 64bit+eclipse 3.7)。只要 JavascriptObject 指针出现运行时空值,任何人都知道如何强制 eclipse 抛出异常。

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

1 回答 1

2

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

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

也就是说...当我编译您的示例时, onModuleLoad() 的主体被优化为:

null.nullMethod();

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

如果您需要确保不对 null 采取行动,请在调用该方法之前测试 null - 如果在像您这样的测试中,该值始终为 null,它将得到优化。无论如何,运行时异常都不应该用于控制代码,因此您永远不应该依赖 NullPointerException 在代码中执行任何操作。

于 2012-04-09T15:51:30.780 回答