java - 如何重现 ClassCircularityError

标签 java jvm

除了抛出新的ClassCircularityError(...)之外,有谁知道如何重现java.lang.ClassCircularityError?如果可能的话,您能给我看一个总是出现错误的 main() 程序示例吗?

根据Javadoc :

Thrown when the Java Virtual Machine detects a circularity in the superclass hierarchy of a class being loaded.

最佳答案

除非运行时使用的某些库的版本与编译时使用的库的版本不匹配,否则通常不会发生此错误。

您可以使用单独的编译轻松重现错误。

首先,使用以下定义编译A.java:

class B {}
class A extends B {}

然后使用反向类层次结构编译 B.java:

class A {}
class B extends A {}

最后,将第一次编译的 A.class 与第二次编译的 B.class 结合起来。之后,尝试运行任一类都会导致

Exception in thread "main" java.lang.ClassCircularityError: A
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

关于java - 如何重现 ClassCircularityError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44631993/

相关文章:

java - 调整 GC 以进行大型缓存刷新

jvm - Firrtl 在输入较大时耗尽堆内存

java - 在 Java 中添加到 ArrayList 中的元素?

java - 丢弃使用过的数组项

java - JVM 选项 -Xss - 它究竟做了什么?

spring - 如何在cloudbees上运行可执行jar文件(例如spring-boot)

scala - Scala 是否在 JamVM 上运行

通过 LAN 使用 TCP/IP 进行 Java 聊天

java - 访问注入(inject)的属性会导致 NullPointerException

java - 为什么即使添加到 JScrollPane 中,JTable 也不显示 Jtable 标题?