gpt4 book ai didi

Java, IllegalAccessorError : superclass access check failed

转载 作者:行者123 更新时间:2023-12-01 11:23:12 24 4
gpt4 key购买 nike

我一直在用 Java 开发自己的一个小项目,最近,我编译了它并收到了这个错误:

Exception in thread "main" java.lang.IllegalAccessError: superclass access check failed: class kröw.zeale.v1.program.core.DataManager$ConstructList (in unnamed module @0x4563e9ab) cannot access class com.sun.javafx.collections.ObservableListWrapper (in module javafx.base) because module javafx.base does not export com.sun.javafx.collections to unnamed module @0x4563e9ab



背景:

所以,我目前有三个不同的类,都在同一个包中。我的层次结构如下:
• Kröw
• DataManager
♦ ConstructList

在我的程序的以前版本中,我的层次结构是这样的:
• Kröw
♦ DataManager
- ConstructList

在这两种情况下, ConstructList 扩展了 com.sun.javafx.collections.ObservableListWrapper<Construct> 。 (我不认为 Construct 类在这里是必需的,我宁愿不显示它,但如果需要我可以。)

无论如何,现在,我的 IDE 可以按预期运行应用程序,但是,当我导出它时,会出现上述异常。

完整堆栈跟踪:
Exception in thread "main" java.lang.IllegalAccessError: superclass access check failed: class kröw.zeale.v1.program.core.DataManager$ConstructList (in unnamed module @0x4563e9ab) cannot access class com.sun.javafx.collections.ObservableListWrapper (in module javafx.base) because module javafx.base does not export com.sun.javafx.collections to unnamed module @0x4563e9ab
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
at java.base/java.security.SecureClassLoader.defineClass(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at kröw.zeale.v1.program.core.DataManager.<init>(DataManager.java:22)
at kröw.zeale.v1.program.core.DataManager.getDataManager(DataManager.java:63)
at kröw.zeale.v1.program.core.Kröw.<clinit>(Kröw.java:23)

错误中提到的类 Kröw 的一部分:
private static final DataManager DATA_MANAGER = DataManager.getDataManager(); // line 23

错误中提到的类 DataManager 的部分:
static DataManager getDataManager() { // line 66
return new DataManager();
}


public final ConstructList constructs = new ConstructList();  // line 22

ConstructList:
public class ConstructList extends ObservableListWrapper<Construct> { // line 209

private ConstructList() {
super(new ArrayList<>()); // line 212
}

public LinkedList<Construct> getDeadConstructs() {
...
}

public LinkedList<Construct> getLivingConstructs() {
...
}
}

现在,我查看了可以找到的资源,例如 IllegalAccessError SO Question

(注意这是怎么说的:“试图访问方法”而不是“父类(super class)访问检查失败”)

该解决方案的公认答案是检查编译后的 jar 文件和我的源代码之间是否有任何不同,所以我尝试了一下,发现了一些细微的差异。这是我反编译的 jar 文件中更改的代码行。 (使用 JD-GUI 反编译)

DataManager:
public final ConstructList constructs = new ConstructList(null);

以前是:
public final ConstructList constructs = new ConstructList();

ConstructList:
private ConstructList() {
super();
}

以前是:
private ConstructList() {
super(new ArrayList<>());
}

现在,在反编译的代码中, ConstructList() 构造函数没有任何参数,我看到它被调用并传入了 null,这对我来说似乎是一个错误,但我不确定它是否是我的异常的原因而且我无法通过互联网找到任何东西,这就是我来这里的原因。

另一方面,我给出的反编译代码是由我的 IDE 创建的,使用它的导出功能。我想看看我的构造函数的 null 参数是否是问题,但我不知道如何以不同的方式编译我的代码来反射(reflect)这一点。如果有人知道如何更改我得到的导出代码,请通知我。

无论如何, 我想知道这个异常是由我的代码的哪一部分引起的,以及如何修复它。

最佳答案

问题来自 Java 9 模块系统,strongly encapsulates JDK-internal APIs ,以及您对 JDK 内部 API 的使用,即 ObservableListWrapper (你可以说它是内部的,因为包名以 com.sun 开头)。如果您或您的用户通过编译或运行 Java 9 来使用 Java 9,此错误将持续存在。

正确的解决方法是停止使用 ObservableListWrapper .判断this presentation (PDF) ,您应该使用 the FXCollections utility class ( 更新 : FXCollections in OpenJFX 11 )。

如果这对您不起作用,则有一种解决方法。添加 --add-exports javafx.base/com.sun.javafx.collections=ALL-UNNAMED编译( javac )和启动( java )命令。

关于Java, IllegalAccessorError : superclass access check failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43463251/

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