Java GWT,非接触元素异常

Java GWT,非接触元素异常,java,javascript,gwt,Java,Javascript,Gwt,我们正在一个大项目中使用GWT。 在某些情况下,此代码可能会产生NoTouchElementException: for (Object o: myList) { } 内部没有对ArrayList的修改 但这种情况最近才发生 在生成的应用程序的源代码中,我发现: var context, context$iterator, operation; operation = doDeserialize(this$static, ctx, json); for (context$iterator =

我们正在一个大项目中使用GWT。 在某些情况下,此代码可能会产生
NoTouchElementException

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);
}
var上下文,上下文$iterator,操作;
operation=doDeserialize(这个$static、ctx、json);
for(上下文$iterator)=
新java_util_AbstractList$IteratorImpl_AbstractList$IteratorImpl_Ljava_util_AbstractList_2V(此$static.jetbrains_jetpad_otmodel_ot_persistence_OperationPersistenceContext_myContextDelegates);
context$iterator.java_util_AbstractList$IteratorImpl_i
首先返回true:
iterator.i
但在下一行
(in.next())
中,此代码也返回true:
iterator.i>=iterator.size()


我只能在Chrome中复制。

我认为这是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

如果您认为您发现了一个bug,并且假设您使用的是最新版本,请在我是GWT的贡献者时提交一个问题,我不确定这是一个bug,bcz我无法意识到这是怎么回事:-(我打开了IteratorImpl:int I=0,last=-1;因此我无法将其设置为0,因为javascript中已经设置了0,所以原型中的0将结束。我建议您添加一个构造函数,在初始化对象时将其设置为0。也就是说,添加
public IteratorImpl(){I=0;}
到类中。我不确定它是否有用,但它在过去的一个类似firefox问题上确实有效。我们将推迟到下一个版本再尝试。昨天,我给他们推了一个bug:我在Gwt用户中替换了Gwt AbstractList仿真类。使用Maven是一个非常大的黑客行为,但它可以工作。我不使用Maven,但修补程序不能o emul之类的东西我保留自己的“超级”目录树,并将其放在gwt-user.jar之前的编译时类路径中。这样我就可以保持gwt-jar的原始状态。