有时我的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)
答案 0 :(得分:3)
如果您没有使用Chrome,在这种情况下它是known bug,唯一的解决方案是切换到Firefox或IE for DevMode或等待SuperDevMode(预计GWT 2.5,到在一个月左右的时间内发布),那么你最好的选择是尝试在产品模式下重现它。
您还可以检查您的JSNI方法(因为它可能来自您自己的代码),因为它可能会返回一个布尔值而不是一个对象(在这个特定情况下)。
答案 1 :(得分: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中没有自动装箱。
你应该返回布尔值,而不是布尔值。
答案 2 :(得分:2)
使用JSNI,您必须return only:
因此,如果原语不符合您的需要,您可以返回布尔或制作您自己的overlay type。但另外坚持使用原始布尔值。