2009-08-30 12 views
0

をコンパイルするときのクラスがあります。のJavaにStackOverflowError cloneメソッド

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

私が取得タイムラインクラスの()メソッドクローンを作成する:

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

を変更(あなたはAbstractTimeIntervalのメソッドのための別の場所を見つける必要があります) ?いくつかのコンパイラにはいくつかのバグがあります。 –

+0

ありがとうございます:http://stackoverflow.com/questions/1352313/adaptrecursive-stackoverflowerror –

答えて

2

これは、コンパイラやJVMのバグを前提とすることはほとんど決して良いアイデアません。問題があなたとあなたのコードにあると仮定すれば、あなたの問題をもっと早く解決するでしょう - 最初、最後、そしていつも。是非、バグデータベースまたはGoogleを検索して、他の誰かがあなたの問題を経験しているかどうかを確認してください。しかし、JVMの長さが長くなり、コードよりも多くのユーザーにバグが公開されていることがわかります。そのため、問題はコード内に存在する可能性が高くなります。どのように物事が「うまくいくか」という誤った仮定。

問題は明白です:あなたはそれがオーバーフローするまで、コールスタックに呼び出しを追加し、再び他を呼び出す、最初の呼び出し、別のを呼び出す一つのクラスのクローン、状況を持っています。 super.clone()の呼び出しを削除すると、サイクルが中断されます。

たぶん開始するには良い場所がある:あなたのクラスのタイムラインは、cloneメソッドをオーバーライドしないのはなぜ?まともなコピーコンストラクタがないのはあなたに何を与えているのですか?おそらくそれは本当にデザイン問題です。

+2

エラー、私はそうは思わない。スタックトレース(特に完全なログ)を見ると、彼がコンパイルしようとしている間にコンパイラ/ Maven内部でこの問題を抱えていることがわかります。私の知らない推測では、彼のコードはコンパイラのいくつかの病理学的事例を引っ張り、mavenはコンパイラが回復できないほどのリソースを消費します(なぜそれがEclipseで動作するのか)。 2回目の走行が成功するという事実は、その推測を支えているようです。 –

1

私はduffymoとaggreeう - コンパイラはただ一つまたは他のクラスがすでにコンパイルされてしまったまでは動作しませんサイクルを解決しようとする(これは、成功するために二度目の原因となることがあります)。詳しく見て撮影

は、この1つは本当に悪いに見えます(すべてのIの点に注意してください):

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

[OK]を、私はあなたがそこに、なぜしようとしたものを知っていると思いますが、相続・ダイアグラムを描くようにしてみてくださいそれのために。私はあなたがそれを再構成する必要があると思います。そのクラスを取り除くと、CRへのリンクを他の日、あなたがこの質問を投稿しませんでした

Timeline extends SortedIntervalsList<Date, AbstractTimeInterval<?>> 

Timeline extends SortedIntervalsList<Date, AbstractInterval<Date,?>> 
関連する問題