【问题标题】:Two java files. Getting IllegalAccessError when running class with main method trying to access a method from the other file两个java文件。使用 main 方法运行类时尝试访问其他文件中的方法时出现 IllegalAccessError
【发布时间】:2019-04-22 14:27:01
【问题描述】:

学习 Java。我有两个文件,每个文件都包含一个 java 类。当我使用 main 方法运行文件时,出现以下错误:

线程“main”java.lang.IllegalAccessError 中的异常:无法从类 TapeDeckTestDrive 访问类 TapeDeck(TapeDeck 位于加载器“app”的未命名模块中;TapeDeckTestDrive 位于加载器 com 的未命名模块中。 sun.tools.javac.launcher.Main$MemoryClassLoader @18bf3d14) 在 TapeDeckTestDrive.main(TapeDeckTestDrive.java:3)

class TapeDeckTestDrive{
  public static void main(String[] args){
    TapeDeck t = new TapeDeck();
    t.canRecord = true;
    t.playTape();

    if (t.canRecord == true) {
        t.recordTape();
    }
  }
}
class TapeDeck {
  boolean canRecord = false;
  void playTape(){

    System.out.println("tape playing");
  }
  void recordTape(){

    System.out.println("tape recording");
  }
}

有什么帮助吗?

【问题讨论】:

  • 您是使用命令提示符还是任何 IDE 来运行您的代码?
  • 错误信息抱怨类TapeDeckcTestDrive。你是如何运行你的代码的?你打错了吗?据我所知,您发布的代码没有错误。
  • 你在同一个包中有这些类吗?如果没有,您必须设置“公共”所有方法和变量...从 oracle 中查看本教程...docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
  • @JeetKumar 我已经尝试过 IntelliJIdea 和命令提示符(我创建了 2 组 .java 文件,因此它们不会访问相同的文件)
  • @tommybee 我将 public 添加到类/方法和布尔值。现在最初的错误消失了,但错误现在是在访问该方法时。见下文:线程“main”java.lang.IllegalAccessError 中的异常:类 TapeDeckTestDrive 试图访问方法 TestDrive.playTape()V(TapeDeckTestDrive 位于加载程序 com.sun.tools.javac.launcher 的未命名模块中.Main$MemoryClassLoader @18bf3d14; TestDrive 位于 TapeDeckTestDrive.main(TDTestDrive.java:5) 的加载程序“app”的未命名模块中

标签: java methods compiler-errors


【解决方案1】:

实际问题

我在做一些非常愚蠢的事情时遇到了同样的错误:

我试图以java {main-class}.java 运行该文件。就这么简单!

请务必以java {main-class} 的形式运行它。


*具体来说,我遇到的错误格式,和你的一样:

线程“main”java.lang.IllegalAccessError 中的异常:无法从类{pack.main-class} 访问类{pack.other-class}{pack.other-class} 在加载程序'app' 的未命名模块中;{pack.main-class} 在未命名中加载器模块 com.sun.tools.javac.launcher.Main$MemoryClassLoader @29f69090)

  {pack.main-class}.{who-cares-where}
{pack.main-class}.{who-cares-why}
。 . .


额外建议

如果你只编译你的{main-class},你可能会在同一个问题上得到一个类似恼人的错误,即无法访问同一目录中的包。

所以不是javac {directory}/{main-class}.java

一定要同时编译所有的,这样交叉引用就没有问题了:
  javac {directory}/*.java


OP 特定

这只是一个愚蠢的命令行错误。如果它也发生在 IntelliJ 中,正如你所说,这不是你的问题。但是,我希望它至少对其他遇到您的问题的人有所帮助!

【讨论】:

    【解决方案2】:

    确保每个类都在同一个文件夹中,因为错误是说 TapeDeckTestDrive 找不到 TapeDeck。我建议从 Eclipse 之类的 IDE 开始,因为它可以帮助您更多地关注编码,而不是文件夹问题。

    我知道你的代码都很好(至少在 java 8 中),因为当我在 eclipse 中复制它时它没有问题,这意味着它必须是文件夹问题,安装的 java 版本有问题,或者方式您正在运行代码由于某种原因无法正常工作。如果这两个文件都在完全相同的文件夹中,那么我会确保您的 java 版本在系统文件中显示 1.8 的内容(程序文件(x86)最有可能在 Windows 中),如果它没有说该版本,那么它可能是另一个问题该版本的代码和语法。 可能有帮助的另一件事是将 public 放在每个类的第一行的“类”后面,并使布尔值公开。这可能是其他 java 版本的语法要求,或者是在命令提示符下运行时需要的东西。

    【讨论】:

    • 1) 向类/方法/布尔值添加了公共。现在错误在于访问 Tapedeck.playTape(),但最初的错误不再存在。 线程 "main" java.lang.IllegalAccessError 中的异常:类 TapeDeckTestDrive 试图访问方法 TestDrive.playTape()V(TapeDeckTestDrive 位于加载程序 com.sun.tools.javac.launcher.Main$ 的未命名模块中MemoryClassLoader @18bf3d14; TestDrive 在 TapeDeckTestDrive.main(TDTestDrive.java:5) 的加载程序“app”的未命名模块中 2) 我有 JDK12.0.1 3) 我已经在IntelliJIdea 中的终端以及命令提示符。相同的错误。
    • 两个文件在同一个文件夹中。
    • 好吧,没关系。现在可以了。将 public 添加到所有方法中就可以了!
    【解决方案3】:

    快速修复,尝试将类和方法设为“公共”。

    在正常情况下,这不应该是必要的,但您可能会遇到可能的特定情况(这是一个边缘情况,所以我不知道这是否是一个问题或不是我的头顶):

    Java 对“默认”包中的内容感到非常不舒服——其他包中的代码无法访问默认包中的对象(意味着没有包声明)。尽管这不会对您造成问题,但您的“包”级别安全设置可能在默认包中也不起作用。

    如果这确实是问题所在,那么两个修复方法是将包和方法公开(如上所述)或将两个类都移到一个包中。

    【讨论】:

      【解决方案4】:

      对我有用的是在方法(playTape 和 recordPlay)和变量(canRecord)中添加关键字“public”。

      【讨论】:

        猜你喜欢
        • 2018-01-06
        • 2013-11-03
        • 2015-06-07
        • 1970-01-01
        • 2013-10-25
        • 1970-01-01
        • 1970-01-01
        • 2012-03-15
        • 1970-01-01
        相关资源
        最近更新 更多