当前位置: 首页 > 知识库问答 >
问题:

Java,IllegalAccessorError:超类访问检查失败

令狐宣
2023-03-14

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

线程“main”java.lang.IllegalAccesserror中出现异常:超类访问检查失败:类kröw.zeale.v1.program.core.datamanager$ConstructList(在未命名模块@0x4563e9ab中)无法访问类com.sun.javafx.Collections.ObservableListWrapper(在模块javafx.base中),因为模块javafx.base没有将com.sun.javafx.Collections导出到未命名模块@0x4563e9ab

所以,我目前有三个不同的类,都在同一个包中。我的层次结构如下:

• Kröw
• DataManager
   ♦ ConstructList

在我的程序的以前版本中,我的层次结构如下所示:

• Kröw
   ♦ DataManager
      - ConstructList

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

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
public class ConstructList extends ObservableListWrapper<Construct> { // line 209

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

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

   public LinkedList<Construct> getLivingConstructs() {
      ...
   }
}
public final ConstructList constructs = new ConstructList(null);
public final ConstructList constructs = new ConstructList();
private ConstructList() {
  super();
}

曾经是:

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

现在,在反编译的代码中,constructlist()构造函数没有任何参数,我看到调用它时传入了null,这在我看来像是一个错误,但我不确定这是否是我的异常的原因,我也无法通过internet找到任何东西,这就是我来这里的原因。

另外,我给出的反编译代码是由我的IDE使用其导出功能创建的。我想看看构造函数中的null参数是否是问题所在,但我不知道如何以不同的方式编译代码来反映这一点。如果有人知道我如何更改导出的代码,请通知我。

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

共有1个答案

元景天
2023-03-14

原来您是用Java9编译的,它利用了JDK新的模块系统。也许有一种有效的方法可以通过实现模块来解决您的问题,但是另一种解决方案是简单地使用Java8进行编译!

 类似资料:
  • 我正在使用nashorn引擎,我正在尝试扩展以下java类 Javascript代码:在init()方法中,我想访问超类成员(直接设置受保护字段的值或使用公共setter) 在java中,我创建对象实例并调用init方法,但字段“name”为空。 我还尝试使用Java.super(扩展). setName("name");但这抛出了一个异常

  • 问题内容: 我正在处理,并且想将a另存为查询。这甚至有可能吗?无论如何,这是我的查询: 它确实可以在AnySQL Maestro中工作,但是不能在Access中工作。 问题答案: Access数据库引擎确实支持CHECK约束,但是不能从Access中的查询设计器中执行创建约束的DDL。必须使用VBA代码和ADO连接创建它们,如下所示:

  • 我看到了“krbeexception:Checksum failed”异常。看起来像是kerberos问题,但我无法解决。 任何关于如何解决问题的建议都会很好!提前谢谢。 机器细节: 没有可用的LSB模块。发行商ID:Ubuntu说明:Ubuntu 12.04.4 LTS发行版:12.04 java版本“1.7.0_55”OpenJDK运行时环境(IcedTea 2.4.7)(7u55-2.4.7

  • 问题内容: 众所周知,私有字段不会在类之间继承。令我着迷的是它如何用于内部静态类。考虑以下代码: 您能否解释一下如何访问其他内部类的私有字段?如果合法,为什么只能通过“ super.XXX”构造实现? 问题答案: 内部类是Java的较晚入门。添加它们时,它们仅作为编译器扩展添加,对JVM不变。 语言规范指出,内部类被允许访问在其内声明的类的私有成员。包括其他内部类。 为了使其工作,编译器会生成桥接

  • 我的子类是,我需要在我的超类中使用字段和。我知道如何在子类中使用超类变量,但我必须学会如何做相反的事情?谢谢。

  • 问题内容: 与我的其他问题略相关:以下内容之间有什么区别: 同样,最后2个之间的差异是我最感兴趣的。 问题答案: 任何包中的类都可以访问公共类。 具有默认访问权限()的类仅对同一包中的其他类可见。 private和protected修饰符只能应用于内部类。 私有类仅对其封闭类以及同一封闭类中的其他内部类可见。 受保护的类对于同一包中的其他类以及扩展该封闭类的类都是可见的。