2011-08-02 52 views
3

我創建使用IllegalStateException異常:無法覆蓋因番石榴map.put

new MapMaker().softValues().maximumSize(cacheSize).makeMap(); 

這似乎做工精細的地圖,但是,我有時會收到下面的異常訪問後在服務器上部署後馬上將新元素添加到地圖中:

java.lang.IllegalStateException: Can't overwrite cause 
    at java.lang.Throwable.initCause(Throwable.java:320) 
    at org.jboss.mx.loading.RepositoryClassLoader.findClass(RepositoryClassLoader.java:624) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:474) 
    at org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:415) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
    at com.google.common.collect.CustomConcurrentHashMap$2.iterator(CustomConcurrentHashMap.java:828) 
    at java.util.AbstractCollection.remove(AbstractCollection.java:241) 
    at com.google.common.collect.CustomConcurrentHashMap$Segment.removeFromChain(CustomConcurrentHashMap.java:2599) 
    at com.google.common.collect.CustomConcurrentHashMap$Segment.processPendingCleanup(CustomConcurrentHashMap.java:2772) 
    at com.google.common.collect.CustomConcurrentHashMap$Segment.runLockedCleanup(CustomConcurrentHashMap.java:2860) 
    at com.google.common.collect.CustomConcurrentHashMap$Segment.preWriteCleanup(CustomConcurrentHashMap.java:2806) 
    at com.google.common.collect.CustomConcurrentHashMap$Segment.put(CustomConcurrentHashMap.java:2374) 
    at com.google.common.collect.CustomConcurrentHashMap.put(CustomConcurrentHashMap.java:3346) 
    at my.app.cache.CacheImplGoogleGuava.put(CacheImplGoogleGuava.java:36) 
... 

可能是什麼原因?

---更新時間:

JBoss的版本是5

設置在Throwable.initCause斷點透露ClassNotFoundException與消息: Invalid use of destroyed classloader for com.google.common.collect.Iterators, UCL destroyed at: 並與堆棧跟蹤

ClassNotFoundException(Throwable).initCause(Throwable):320 
UnifiedClassLoader3(RepositoryClassLoader).findClass(String):628 
... 
UnifiedClassLoader3(ClassLoader).loadClass(String):248 
CustomConcurrentHashMap$2.iterator():828 
CustomConcurrentHashMap$2(AbstractCollection<E>).remove(Object):241 
CustomConcurrentHashMap$Segment.enqueueCleanup(...):2738 
CustomConcurrentHashMap$Segment.unsetValue(...):2662 
CustomConcurrentHashMap<K, V>.reclaimValue(...) 
CustomConcurrentHashMap$SoftValueReference<K, V>.finalizeReferent():1637 
... 
Method.invoke:574 
Finalizer.claenUp:154 
Finalizer.run:127 

從堆棧跟蹤,看起來好像地圖中的某個對象已經在finalizeReferent的類別com.google.common.collect.Iterators中無法加載。

+1

這似乎更像是一個JBoss問題而不是番石榴問題。由於Guava代碼的緣故,您正好碰到它。 –

回答

5

你的問題似乎與MapMaker或一般番石榴無關。

您只會看到處理另一個異常時發生的異常(不幸)。

Throwable.initCause()拋出時,同時已經有指定的一個原因,它被稱爲一個異常電流Throwable(通過該方法或constructor`。

RepositoryClassLoader.findClass()方法似乎是處理一些例外,預計不有一個原因,但實際上它已經具備了設置的原因,這將觸發此異常。

不幸的是,你在這裏看到的異常隱藏實際的異常(這很可能是解決問題重要得多)。

嘗試在Throwable.initCause()行320或RepositoryClassLoader.findClass()(行624)放置一個breakpoit,並將問題重現爲(希望)在IDE的本地變量視圖中看到「真實」異常。

+0

如果我理解正確,原始異常是「隱藏」的事實來自可能的JBoss錯誤552,但未完全解決。然而,我原來的ClassNotFoundException異常(請參閱更新後的問題)似乎有一個原因位於番石榴某處,不是嗎? – stracktracer

+0

@stacktracer:這可能是由Guava中的某些內容引起的,但我從來沒有看到過這個錯誤信息,它似乎是JBoss特有的。 –

2

這似乎是一個已知的JBoss錯誤,可能已在新版本的平臺中解決。這裏至少有一個類似的錯誤:

JBREM-552: cannot init cause of ClassCastException

您可以嘗試升級您的JBoss的版本(雖然這個特定的錯誤暗示的修復是在2006年),或者提交另一個bug,如果你的版本是最新的。這可能是修復很瑣碎,只能修復那個bug的作者報告的情況,而不是類似的情況。