2009-08-30 36 views
0

有兩類:的Java的StackOverflowError

InterfaceInterval<C extends Comparable<C>, I extends InterfaceInterval<C, I>> extends Comparable<InterfaceInterval<C, ?>> 
AbstractInterval<C extends Comparable<C>, I extends AbstractInterval<C, I>> implements InterfaceInterval<C, I>, Serializable, Cloneable 
AbstractTimeInterval<I extends AbstractTimeInterval<I>> extends AbstractInterval<Date, I> 
SortedIntervalsList<C extends Comparable<C>, I extends AbstractInterval<C, ?>> extends ArrayList<I> 
Timeline extends SortedIntervalsList<Date, AbstractTimeInterval<?>> 

現在加入這一行:

Timeline t = (Timeline) super.clone(); 

到clone()方法中的Timeline類,我得到:

mvn -e clean compile 
The system is out of resources. 
Consult the following stack trace for details. 
java.lang.StackOverflowError 
    at com.sun.tools.javac.code.Type$WildcardType.isSuperBound(Type.java:435) 
    at com.sun.tools.javac.code.Types$1.visitWildcardType(Types.java:102) 
    at com.sun.tools.javac.code.Types$1.visitWildcardType(Types.java:98) 
    at com.sun.tools.javac.code.Type$WildcardType.accept(Type.java:416) 
    at com.sun.tools.javac.code.Types$MapVisitor.visit(Types.java:3232) 
    at com.sun.tools.javac.code.Types.upperBound(Types.java:95) 
    at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2986) 
    at com.sun.tools.javac.code.Types.adapt(Types.java:3016) 
    at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2977) 
    at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2986) 
    at com.sun.tools.javac.code.Types.adapt(Types.java:3016) 
    ... 
    at org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:516) 
    at org.apache.maven.plugin.CompilerMojo.execute(CompilerMojo.java:114) 
    at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:451) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:558) 
    ... 16 more 

但是,當我評論該行:

//Timeline t = (Timeline) super.clone(); 

和:

mvn compile 
... 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
... 

然後取消註釋該行再次:

Timeline t = (Timeline) super.clone(); 

和:

mvn compile 
... 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
... 

所以它正常工作與幫助不大)。在Eclipse上它也可以:/。我該怎麼辦?這是一個Java編譯器錯誤或什麼?

The full console log.

+0

你沒有張貼此問題前些天有一個鏈接到CR ?某些編譯器的某些版本有一些錯誤。 –

+0

是的,笨蛋:http://stackoverflow.com/questions/1352313/adaptrecursive-stackoverflowerror –

回答

2

這是幾乎從來沒有一個好主意,假設在編譯器或JVM中的錯誤。如果你認爲問題出在你和你的代碼上,你會更快地解決你的問題 - 首先,最後和始終。通過一切手段,搜索錯誤數據庫或谷歌,看看是否有其他人遇到過你的問題。 (這是我做的第一件事,當我得到一個異常。),但你會發現,JVM一直圍繞更長,有更多的用戶暴露的錯誤比你的代碼了,所以機會是更大的問題出在你的代碼或關於事情「應該」如何工作的錯誤假設。

的問題是顯而易見的:你有一個情況,其中一個類調用另一個,它調用第一,它再次調用其它,添加調用調用堆棧,直到它溢出的克隆。刪除對super.clone()的調用會中斷循環。

也許一個好的開始是:爲什麼你的類時間軸覆蓋克隆方法?它給你什麼是一個體面的副本構造函數不?也許這確實是一個設計問題。

+2

錯誤,我不這麼認爲。如果你看看堆棧跟蹤(尤其是完整的日誌),你會發現他在編譯器/ maven內部遇到了這個問題,而他正在嘗試編譯,現在正在運行。我不明白的猜測是他的代碼在編譯器中絆倒了一些病態的情況,並且maven消耗了足夠的資源,導致編譯器無法恢復(因此爲什麼它在eclipse中「起作用」)。第二輪運行成功的事實似乎支持這種猜測。 –

1

我會duffymo aggree - 編譯器試圖解決一個週期,這是不會到一個或其他類已經得到編譯工作(這可能會導致第二次成功)。

以仔細一看,這個人看起來非常糟糕(注意,所有的I S):

AbstractTimeInterval<I extends AbstractTimeInterval<I>> extends AbstractInterval<Date, I> 

好吧,我想我知道你試過沒有,爲什麼什麼,但儘量畫的繼承,圖那個。我認爲你需要重組那個。擺脫類的(你必須找到在AbstractTimeInterval方法的另一個地方),並更改

Timeline extends SortedIntervalsList<Date, AbstractTimeInterval<?>> 

Timeline extends SortedIntervalsList<Date, AbstractInterval<Date,?>>