JSNI方法返回了除int以外的其他类型

19

我在 hosted mode 下运行一个 GWT 应用程序。偶尔会出现一个奇怪的 HostedModeException,抱怨从 JSNI 返回的 JS 值的类型。有时是在反序列化期间:

 com.google.gwt.dev.shell.HostedModeException: Something other than an int was returned from JSNI method '@com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader::readInt()': JS value of type boolean, expected int
    at com.google.gwt.dev.shell.JsValueGlue.getIntRange(JsValueGlue.java:266)
    at com.google.gwt.dev.shell.JsValueGlue.get(JsValueGlue.java:144)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeInt(ModuleSpace.java:247)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeInt(JavaScriptHost.java:75)
    at com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader.readInt(ClientSerializationStreamReader.java)

有时候在:

 com.google.gwt.dev.shell.HostedModeException: Something other than an int was returned from JSNI method '@com.google.gwt.user.client.impl.DOMImpl::eventGetTypeInt(Ljava/lang/String;)': JS value of type null, expected int
    at com.google.gwt.dev.shell.JsValueGlue.getIntRange(JsValueGlue.java:266)
    at com.google.gwt.dev.shell.JsValueGlue.get(JsValueGlue.java:144)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeInt(ModuleSpace.java:247)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeInt(JavaScriptHost.java:75)
    at com.google.gwt.user.client.impl.DOMImpl.eventGetTypeInt(DOMImpl.java)
    at com.google.gwt.user.client.impl.DOMImpl.eventGetTypeInt(DOMImpl.java:62)
    at com.google.gwt.user.client.DOM.eventGetType(DOM.java:602)
    at com.google.gwt.user.client.Event$.getTypeInt$(Event.java:695)
    at com.extjs.gxt.ui.client.util.BaseEventPreview.onPreviewNativeEvent(BaseEventPreview.java:139)

再次在

com.google.gwt.dev.shell.HostedModeException: Something other than a float was returned from JSNI method '@com.extjs.gxt.ui.client.util.Util::parseFloat(Ljava/lang/String;F)': JS value of type boolean, expected float
    at com.google.gwt.dev.shell.JsValueGlue.get(JsValueGlue.java:118)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeFloat(ModuleSpace.java:235)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeFloat(JavaScriptHost.java:67)
    at com.extjs.gxt.ui.client.util.Util.parseFloat(Util.java)
    at com.extjs.gxt.ui.client.core.El.getFrameSize(El.java:1081)
    at com.extjs.gxt.ui.client.core.El.setSize(El.java:2702)
    at com.extjs.gxt.ui.client.widget.BoxComponent.setSize(BoxComponent.java:501)
    at com.extjs.gxt.ui.client.widget.BoxComponent.setHeight(BoxComponent.java:320)

有人能帮我吗? 我正在使用GWT 2.4.0,Google Chrome 16.0.912.75和GWT Developer Plugin 1.0.9738。


我很想帮忙,因为我也会偶尔遇到这种随机异常...但是我毫无头绪!不过,通常它并不影响我的调试,所以我只能忍受它...但知道背后的原因会更好。 - Renato
我的情况和你的一样,以前每个月会发生一次左右,但是现在在我目前工作的项目中,这种情况经常发生,一天多次。这就是为什么我觉得我的配置可能有问题。不幸的是,它也很难复制。用Jusio的话来说,这是神奇的。 - Saintali
这个问题在 https://dev59.com/wWLVa4cB1Zd3GeqPukAY 也有重复,那里提供了一个解决方法。 - Glenn
1个回答

17

由于某些神奇的原因,Chrome 在使用 GWT DevMode 时表现非常糟糕。在解析 JSON 时出现随机的空指针异常、在使用 GXT 时出现 JSNI 返回类型错误、以及远程死亡异常是非常常见的问题。这是一个已知的问题,所以大多数人都不使用 Chrome 进行 GWT DevMode 开发。


很奇怪,它们都来自谷歌。实际上,我这里有一个遗留应用程序,将其移植到Firefox需要额外的努力:( - Saintali
确实很奇怪,我们不得不为我们的项目创建单独的JSON解析器,因为Chrome中的DevMode总是与标准实现冲突。不幸的是,对于像GXT这样的框架,没有这样的解决方法。 - jusio
2
值得指出的是,这只会在开发模式下发生(编译后的代码将正常运行),而且只会在某些jsni中有时发生。这是一个长期存在的问题,最终会在任何jsni中发生。http://code.google.com/p/google-web-toolkit/issues/detail?id=5778 - Colin Alworth
2
谢谢 Colin,我又觉得很奇怪了,因为这个 bug 是在 2010 年 12 月报告的,关于 GWT 2.1.0 和 Chrome 10.0.612.1。那时候已经过去了好几个世纪。 - Saintali
1
这也会发生在IE 10上(如果有关系的话,是Windows 8)。 - Καrτhικ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接