我在这里看到过类似的问题,但是找不到适合我的情况的问题,如果这是一个陈旧的问题,请抱歉。

我有一个类P,它是〜/ JavaClasses / myname / utils中的myname.utils包的一部分。我还有另一个类Printing,它没有声明为任何软件包的一部分,但是位于〜/ JavaClasses / myname / practice中。 Class Printing导入了类P。这两个类都可以从〜/ JavaClasses目录进行编译。但是,当我尝试运行这样的已编译类Printing时

~/JavaClasses$ java myname/practice/Printing


我收到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: myname/practice/Printing (wrong name: Printing)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

最佳答案

该错误与myname.utils.P类无关,但是会发生此错误,因为Printing类没有包定义。这意味着该类的真实全名是Printing,但是如果您从〜/ JavaClasses文件夹启动java命令,则恰好说明了Printing类的全名是myname.practice.Printing。

您有2个解决此问题的方法:

1)在Printing类中声明myname.practice包(我建议这样做)

2)通过以下方式将myname.practice文件夹添加到类路径:

~/JavaClasses$ java -cp myname.practice:. Printing


.表示当前目录,这是必需的,因此您仍然可以从〜/ JavaClasses文件夹引用myname.utils.P类。

边注。在编译时,您没有任何错误,因为启动javac时可能未指定类路径,因此将使用当前文件夹。这样,每个类都可以毫无问题地引用myname.utils.P,甚至可以通过Printing进行引用。

关于java - NoClassDefFoundError Java(名称错误),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28370822/

10-12 06:26