0

いくつかのデバッグの後、「com.google.gwt.event.shared.UmbrellaException:One or more exceptions catch, see full set in UmbrellaException#getCauses' when calling method: [nsIDOMEventListener::handleEvent]」(Web モデル内) が見つかりました。ランタイムヌルポインターが原因です。質問は、この種のランタイムヌルポインター例外がホストモ​​デルでスローされなかった理由です。実際、ブローコードは例外をスローせず、ラップトップでアラートポップアップも表示されません(gwt 2.4 + Java 7 64bit+ubuntu 12.04 64bit+eclipse 3.7). JavascriptObject ポインターでランタイム null が発生するたびに例外をスローする 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 に変換するために多くの最適化を実行します。

  • 型とメソッドは final になります。これにより、後のステップで、単一の実装を呼び出すだけで、どのメソッドを通常どおりディスパッチする必要があり、どのメソッドを静的にすることができるかを理解できます。
  • 可能な場合、メソッドは静的になり、メソッドをインライン化できるようになります
  • 可能かつ合理的な場合、メソッドはインライン化されます

そうは言っても...サンプルをコンパイルすると、 onModuleLoad() の本体は次のように最適化されます。

null.nullMethod();

これは、GWT コンパイラが「これは決して機能しない」と言う方法です。値が常に null であるため、メソッドを呼び出すことができないことに気付きます。しかし、Dev Mode では、どうやら null オブジェクトがwindowJavaScript のオブジェクトを指しているままになっているようです。これは、GWT プロジェクトのhttp://code.google.com/p/google-web-toolkit/issues/detail?id=6625にファイルされています。

null に対して動作しないことを確認する必要がある場合は、メソッドを呼び出す前に null をテストします。あなたのようなテストで、値が常に null の場合は最適化されます。とにかくコードを制御するために実行時例外を使用しないでください。

于 2012-04-09T15:51:30.780 に答える