gpt4 book ai didi

编译克隆方法时出现 Java StackOverflowError

转载 作者:行者123 更新时间:2023-12-02 00:54:47 26 4
gpt4 key购买 nike

有类(class):

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

到Timeline类中的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.

最佳答案

假设编译器或 JVM 中存在错误几乎从来都不是一个好主意。如果您假设问题出在您和您的代码上(首先、最后且始终),那么您会更快地解决问题。无论如何,一定要搜索错误数据库或谷歌,看看是否有其他人遇到过你的问题。 (这是当我遇到异常时我做的第一件事。)但是您会发现 JVM 的存在时间更长,并且比您的代码有更多的用户暴露错误,因此问题出在您的代码或代码中的可能性更大。关于事情“应该”如何运作的错误假设。

问题很明显:您会遇到这样一种情况:一个类的克隆调用另一个类,该类调用第一个类,该类再次调用另一个类,将调用添加到调用堆栈直到溢出。删除对 super.clone() 的调用会破坏循环。

也许一个好的起点是:为什么你的类 Timeline 重写了克隆方法?它给了你什么是一个像样的复制构造函数所没有的?也许这确实是一个设计问题。

关于编译克隆方法时出现 Java StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1354979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com