0

時々、私の GWT アプリは以下の「Uncaught IllegalArgumentException」を報告します。エラー ログは、考えられる原因をアプリから効果的に隠します。この場合、問題の原因を実際にどのように突き止めますか?

[ERROR] [mygwtapp] Uncaught exception escaped

java.lang.IllegalArgumentException: Something other than a Java object was returned from JSNI method '@com.google.gwt.core.client.impl.Impl::apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)': JS value of type boolean, expected java.lang.Object
    at com.google.gwt.dev.shell.JsValueGlue.get(JsValueGlue.java:178)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:271)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)
    at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:292)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:546)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)
    at java.lang.Thread.run(Thread.java:662)
4

3 に答える 3

3

Chrome を使用していない場合、これは既知のバグであり、唯一の解決策は、DevMode を Firefox または IE に切り替えるか、 SuperDevModeを待つことです(GWT 2.5 が 1 か月程度でリリースされる予定です)。あなたの最善の策は、製品モードで再現することです。

オブジェクトの代わりにブール値を返す可能性があるものについては、JSNI メソッドをチェックすることもできます (それはおそらく独自のコードから来るためです) (この特定のケースでは)。

于 2012-05-21T12:18:55.490 に答える
2

このエラーは、呼び出されたJSNI関数の戻り値との型の不一致がある場合に発生します。

例えば:

public class GWTTest implements EntryPoint 
{ 
    public void onModuleLoad() { 
        if(get()==false){ 
            System.out.println(get()); 
        } 
    } 
    private native Boolean get()/*-{ 
        return false; 
    }-*/; 
}

ここで、エラー「java.lang.IllegalArgumentException:Javaオブジェクト以外のものがJSNIメソッドから返されました」が表示されます。

注意:javascriptには自動ボクシングはありません。

ブール値ではなくブール値を返す必要があります。

于 2012-05-21T15:14:09.910 に答える
2

JSNI では、以下のみを返す必要があります。

  • JavaScriptObject を拡張するオブジェクト
  • プリミティブと文字列 ( JS には存在しないため、長くはありません)
  • Javaコードから派生した Java オブジェクトまたは配列

したがって、プリミティブがニーズを満たさない場合は、ブール値を返すか、独自のオーバーレイ タイプを作成できます。それ以外の場合は、プリミティブブール値に固執します。

于 2012-05-21T17:46:55.097 に答える