【问题标题】:GWT, NoSuchElement exceptionGWT,NoSuchElement 异常
【发布时间】:2013-09-28 09:24:10
【问题描述】:

我们在一个大型项目中使用 GWT。 在某些情况下,这段代码可以产生NoSuchElementException:

for (Object o: myList) {
}

里面没有对ArrayList的修改。

但这发生在最近。

在生成的应用程序的源代码中我发现:

var context, context$iterator, operation;
operation = doDeserialize(this$static, ctx, json);
for (context$iterator =
    new java_util_AbstractList$IteratorImpl_AbstractList$IteratorImpl__Ljava_util_AbstractList_2V(this$static.jetbrains_jetpad_otmodel_ot_persistence_OperationPersistenceContext_myContextDelegates);
    context$iterator.java_util_AbstractList$IteratorImpl_i < context$iterator.java_util_AbstractList$IteratorImpl_this$0.size__I();
) {
    context = java_util_AbstractList$IteratorImpl_$next__Ljava_util_AbstractList$IteratorImpl_2Ljava_lang_Object_2(context$iterator);
}

所以首先返回 true:iterator.i &lt; iterator.size(); 但在下一行 (in .next()) 中,此代码也返回 true:iterator.i &gt;= iterator.size();

我只能在 Chrome 中重现。

【问题讨论】:

  • 如果你认为你发现了一个错误,并且假设你使用的是最新版本,请在code.google.com/p/google-web-toolkit/issues/entry提出问题
  • 我是 GWT 的贡献者,我不确定这是一个错误,bcz 我不知道它是怎么回事 :-(

标签: java javascript gwt


【解决方案1】:

我相信这是 chrome 的 javascript 实现中的一个错误。它很少出现在通常运行的代码路径中,所以我怀疑这是一个微妙的时间问题。自 Chrome 29.0.1547.57 以来一直在发生这种情况。

对于最近几个版本的 chrome,我们的客户每天都会看到一些这种情况。但是我们自己无法重现它,我也找不到导致 = 以这种方式运行的值。

你的证据是我看到的其他人有这个问题的第一个证据。

一个疯狂的猜测是 i 的值并没有立即从原型传递到新对象。 (我们几年前在 Firefox 中看到了类似的问题。)您可以尝试调整 AbstractList$IteratorImpl 以在构造函数中显式设置 i=0,这可能足以防止错误触发。 (我们还没有在生产中尝试过这个,我们希望它会在上游得到修复。)

我们在诸如 PopupPanel 之类的地方看到了这一点,但我们还没有接触过:

Object.java.lang.RuntimeException.RuntimeException()@89F75B80AAD5A61ED1288B1136D17E39.cache.html:3144
Object.java.util.NoSuchElementException.NoSuchElementException()@89F75B80AAD5A61ED1288B1136D17E39.cache.html:3247
java.util.AbstractList$IteratorImpl.$next()@89F75B80AAD5A61ED1288B1136D17E39.cache.html:6218
com.google.gwt.user.client.ui.PopupPanel.$eventTargetsPartner()@89F75B80AAD5A61ED1288B1136D17E39.cache.html:7593
com.google.gwt.user.client.ui.PopupPanel.$previewNativeEvent()@89F75B80AAD5A61ED1288B1136D17E39.cache.html:8326

【讨论】:

  • 我打开了 IteratorImpl: int i = 0, last = -1;所以我不能把它设置为0,bcz它已经设置好了
  • 在 javascript 中,零在原型中结束。我建议您添加一个构造函数,在初始化对象时将其设置为 0。即在类中添加public IteratorImpl() { i=0; }。我不确定它是否会有所帮助,但它确实适用于过去类似的 Firefox 问题。我们将推迟到我们的下一个版本进行尝试。
  • 昨天,我向他们推送了一个错误:code.google.com/p/chromium/issues/… 我替换了 gwt-user 中的 Gwt AbstractList 仿真类。这是使用 Maven 的一个非常大的 hack bcz,但它确实有效
  • 我不使用 maven,但对于 emul 的补丁,我保留了自己的“超级”目录树,并将其放在 gwt-user.jar 之前的编译时类路径中。这样我就可以保持 GWT 罐子的原始状态。
猜你喜欢
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多