java GWT,NoTouchElement异常
我们正在一个大项目中使用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 楼答案
我相信这是chrome的javascript实现中的一个缺陷。它很少出现在通常运行的代码路径中,所以我怀疑这是一个微妙的时间问题。自Chrome 29.0.1547.57以来,这种情况一直在发生
在chrome的最后几个版本中,我们的客户每天都会看到这样的例子。但我们无法自己复制它,我也找不到导致它的价值观<;和>;=这样做
你的是我第一次看到其他人有这个问题的证据
有一种猜测是,i的价值并没有立即从原型转移到新对象。(几年前,我们在Firefox上看到了类似的问题。)您可以尝试调整
AbstractList$IteratorImpl
以在构造函数中显式设置i=0,这可能足以防止错误触发。(我们还没有在生产中尝试过,我们希望它能在上游得到修复。)我们在PopupPanel这样的地方看到了这一点,我们没有接触过: