3

我们在一个大项目中使用 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 < iterator.size(); 但在下一行(in .next())代码也返回 true:iterator.i >= iterator.size();

我只能在 Chrome 中重现。

4

1 回答 1

0

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

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

你的是我见过的第一个证据表明其他人有这个问题。

一个疯狂的猜测是i的值并没有立即从原型传递到新对象。(几年前我们在 Firefox 中看到了类似的问题。)您可以尝试在构造函数中显式调整AbstractList$IteratorImpli =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
于 2013-09-23T18:30:12.900 回答