有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 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