2013-09-23 69 views
3

我們在一個大項目中使用GWT。 在一些情況下,這種代碼能夠產生NoSuchElementExceptionGWT,NoSuchElement例外

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();

我可以重現在鉻只要。

+0

如果您認爲您發現了一個錯誤,並且假設您使用的是最新版本,請通過https://code.google.com/p/google-web-toolkit/issues/entry –

+0

提交問題我是貢獻者GWT,我不知道這是一個錯誤,bcz我不知道它怎麼會是:-( – AKonst

回答

0

我相信這是Chrome的JavaScript實現中的一個錯誤。它很少出現在通常運行的代碼路徑中,所以我懷疑這是一個微妙的時間問題。自從Chrome 29.0.1547.57發佈以來,它一直在發生。

我們的客戶每天都會看到這種情況,最近幾個版本的鉻版本。但我們無法自己複製,也無法找到導致<和> =的行爲。

你是我見過的其他人有這個問題的第一個證據。

一個瘋狂的猜測是,的價值並沒有立即從原型到新對象的方式。 (我們在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 
+0

我打開IteratorImpl:int i = 0,last = -1; 所以我不能設置它爲0,bcz它已經設置了 – AKonst

+0

在javascript中,零在原型中結束。我建議你廣告d一個構造函數,在初始化對象時將其設置爲0。也就是說,添加'public IteratorImpl(){i = 0; '去班上。我不確定它是否會有所幫助,但它確實可以解決過去類似的Firefox問題。我們推遲嘗試,直到我們的下一個版本。 – Steve

+0

昨天,我向他們推送了一個bug:http://code.google.com/p/chromium/issues/detail?id=297570&thanks=297570&ts=1380027626 我用gwt-user替換了Gwt AbstractList仿真類。這是一個非常大的使用Maven的黑客bcz,但它的工作原理 – AKonst