0

有时我的 GWT 应用程序会在下面报告“未捕获的 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,在这种情况下,这是一个已知错误,唯一的解决方案是切换到 Firefox 或 IE 进行 DevMode 或等待SuperDevMode(预计 GWT 2.5,将在一个月左右发布),然后你最好的选择是尝试在 prod 模式下重现它。

您还可以检查您的 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:从 JSNI 方法返回的不是 Java 对象”

请记住:javascript 中没有自动装箱。

您应该返回布尔值,而不是布尔值。

于 2012-05-21T15:14:09.910 回答
2

使用 JSNI,您必须只返回

  • 扩展 JavaScriptObject 的对象
  • Primitives & String (因为在JS中没有一个)
  • 来自 Java 代码的Java 对象或数组

因此,如果原语不能满足您的需求,您可以返回布尔值或创建自己的覆盖类型。但否则坚持使用原始布尔值。

于 2012-05-21T17:46:55.097 回答