GET,NoSuchElementexception

时间:2013-09-23 13:02:18

标签: java javascript gwt

我们在一个大项目中使用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中重现。

1 个答案:

答案 0 :(得分:0)

我相信这是chrome的javascript实现中的一个错误。它在常用的代码路径中很少出现,因此我怀疑这是一个微妙的时序问题。自Chrome 29.0.1547.57以来,它一直在发生。

我们的客户每天都会看到一些这样的实例,即最后几个版本的chrome。但我们自己无法重现它,也无法找到导致&lt;和&gt; =以这种方式行事。

你的第一个证据就是我见过别人有这个问题。

一个疯狂的猜测是 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
相关问题