【问题标题】:Compilation error when using Java Package?使用 Java Package 时出现编译错误?
【发布时间】:2013-11-29 16:02:49
【问题描述】:

我知道这个问题很基础,但是经过几次谷歌搜索后我找不到答案。我是 Java 新手。今天我学习了java包。我有这样的A类:

package hello;

public class A {

}

我也有使用 A 类的 B 类:

package hello;

public class B {
    public static void main(String[] args) {
        A a = new A();
    }
}

A 类和 B 类放在“hello”文件夹中。当我编译 B 时,我得到了这样的错误:

B.java:5: error: cannot find symbol
                A a = new A();
                ^
  symbol:   class A
  location: class B
B.java:5: error: cannot find symbol
                A a = new A();
                          ^
  symbol:   class A
  location: class B
2 errors

编辑:在 cmd 中输入

>>javac A.java

>>javac B.java

    B.java:5: error: cannot find symbol
                    A a = new A();
                    ^
      symbol:   class A
      location: class B
    B.java:5: error: cannot find symbol
                    A a = new A();
                              ^
      symbol:   class A
      location: class B
    2 errors

我尝试使用这个命令编译:

>>javac *.java

>> java B
Exception in thread "main" java.lang.NoClassDefFoundError: B (wrong name: hello/
B)
        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)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

【问题讨论】:

    标签: java oop package


    【解决方案1】:

    尝试在 hello 目录中同时编译两者:javac *.java

    如果你在没有 A 的情况下编译 B,java 不知道 A,所以你会得到错误。如果同时编译(使用 *.java),javac 可以正确链接。

    要运行,试试这个:从 hello 跳出一层(就像你可以看到 hello 文件夹一样)。然后输入 java hello.B。它应该工作。这样做的原因是因为我们已经将它打包在 hello 下,java 需要 FQCN(完全限定类名),告诉它 B 在文件夹 hello 中找到。

    【讨论】:

    • 先编译A.java,再编译B.java
    • 您尝试过我或 Narendra 建议的两个命令中的任何一个吗?即 javac -cp 。或 javac *.java 而不是你的两个命令?关键是你不能单独编译它们,因为一个依赖于另一个。我们的命令应该解决这种依赖关系,因为两者都是“一起”完成的,可以这么说。
    • 是的,我做到了。我使用 javac *.java 之类的命令进行编译。它运行时没有错误警告,但是当我运行 B 类时,我得到了很多错误
    • 所以试试这个:从 hello 跳出一层(你可以看到 hello 文件夹)。然后输入 java hello.B。它应该工作。这样做的原因是因为我们已经将它打包在 hello 下,java 期望 FQCN(完全限定类名),告诉它在文件夹 hello 中找到了 B。
    • 非常感谢。你的回答和解释对我很有帮助。 :)
    【解决方案2】:

    不是编译错误,而是执行错误。

    像这样运行java hello.B

    这是因为您的 Main class B 在包 hello 中。所以要提到它,你必须说hello.B

    【讨论】:

    • 你能告诉我们你是如何编译的吗?您可以编辑问题以向我们展示。您不能编辑其他人的评论以发表评论。
    • javac A.java 然后 javac B.java
    猜你喜欢
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2013-06-16
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多