【问题标题】:Error when I try to change the class name尝试更改类名时出错
【发布时间】:2009-02-15 23:33:16
【问题描述】:
class HelloObject {
    void speak() {
        System.out.println("Hello (from object)!");
    }
}
class HelloTester {
    public static void main(String[] args) {
        HelloObject object = new HelloObject();
        object.speak();
    }
}

当我将“HelloTester”类名更改为“HelloTester2”之类的名称时,程序突然可以工作了。类文件名为 ClassesBegin.java。

当我尝试更改类的名称时,为什么 java 程序不起作用?

编辑:对不起,我应该澄清更多。我将类名更改为 HelloTestera,这是我得到的错误: 线程“主”java.lang.NoClassDefFoundError 中的异常:HelloTester 但即使文件名与类名无关,它也可以工作。当文件名为 ClassesBegin.java 时,它与 HelloTester 一起使用

【问题讨论】:

  • 是什么不工作?你的例子对我来说很好。
  • 该示例应该可以工作,但由于某种原因,当 HelloTester 更改为 HelloTesterAAA 之类的内容时出现错误。
  • 请更具体地说明您的工作(.java 文件名、.class 文件、命令行)。

标签: java class


【解决方案1】:

您需要更改文件名,而不仅仅是类名。

在 Java 中,.java 和 .class 名称必须与类名相同。

因此,每个类都必须使用其名称转到一个单独的文件,以便创建一个单独的 .class 文件。

将两个不同的类放在同一个文件中是一种适用于其编译模型而非 Java 的 C++ 实践。

编辑:用户最终澄清了导致他的错误的原因,所以显然我在这里的回答是不相关的。以上均适用于公开课。尽管我不得不说我认为这是一种可怕的做法,但您可以将其用于包级课程。如果你的包中有多个类使用的东西,请给它自己的文件。如果它仅由一个类使用,则使其成为内部类...

【讨论】:

  • 这仅适用于公共课程。
  • 如何将顶级课程设为私有?我的理解是只有内部类可以是私有的。
  • 至于默认级别的课程,嗯,这是真的,但我怀疑他是否故意遗漏了公众。
  • 即使是包含 main 的类?我承认我从未尝试使用包含在不同类名中的 main() 来编译文件。您不需要具有正确名称的类文件吗?
  • 我尝试了这个例子,并且使用 main 方法运行该类工作正常(在 Eclipse 中)。
【解决方案2】:

“编辑:对不起,我应该澄清更多。我将类名更改为 HelloTestera,这是我得到的错误:线程“main”中的异常 java.lang.NoClassDefFoundError: HelloTester 但即使文件名有与类名无关。当文件名为 ClassesBegin.java 时,它与 HelloTester 一起使用"

如果类是公共的,则文件名和类名必须匹配。

如果您将类名更改为“HelloTestera”但运行了“java HelloTester”(这是 java.lang.NoClassDefFoundError: HelloTester 所指示的),那么问题是您将错误的类名传递给了“java”。

但是可以节省大量时间并将类和文件命名为相同的名称,并将其保留在每个文件的一个顶级类中。一种“强制”的简单方法是暂时将所有类公开(每个文件只能有一个公共类)。这确实可以避免你犯一些错误。

【讨论】:

    【解决方案3】:

    就编译而言,您可以在 ClassesBegin 文件中包含任意数量的非公共类。但只有公共(在这种情况下为 ClassesBegin;直到您更改文件名)才能在外部使用。

    特别是 main() 方法必须是公共的,并且在公共类中才能被 java 找到。将您的文件重命名为 HelloTester 以使其工作。

    或者 - 重命名 IDE 中的 HelloTester 类,这可能会自动重命名文件,因为它有一个 main 方法,并且 IDE 知道它需要是公共类...

    【讨论】:

      【解决方案4】:

      最简单的方法是:

      1) 每个文件只有一个顶级类 2)类名和文件名必须匹配(name和CasE)

      这使您更容易找到类(类的名称就是文件的名称),并且您不会遇到一些奇怪的问题,即编译器无法找到所有要编译的类。

      Java 也有一个限制,即公共类的名称 100% 必须与文件名相同。该限制仅适用于公共类(或接口或枚举)。您可以在一个文件中拥有任意数量的非公共类型......但不要这样做 - 坚持每个文件使用一个顶级类/接口/枚举。

      【讨论】:

        【解决方案5】:

        你写:

        我将类名更改为 HelloTestera,这是我得到的错误:线程“main”中的异常 java.lang.NoClassDefFoundError: HelloTester

        看来您实际上并没有运行重命名的类,而是旧的类。您是否使用新更改的类名调用 Java?您在运行类之前是否重新编译了文件?

        重命名类后,你应该先运行:

        javac ClassesBegin.java

        然后:

        java HelloTestera

        这对我来说是:

        你好(来自对象)!

        通常,在使用 IDE 时,这些问题会为您处理(运行前编译)。

        【讨论】:

          猜你喜欢
          • 2018-06-19
          • 1970-01-01
          • 2017-11-01
          • 1970-01-01
          • 2015-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多