NoClassDefFoundError Java(错误的名字)

时间:2015-02-06 16:55:38

标签: java exception packages

我在这里看过这样的问题,但我找不到一个特定于我情况的问题,很抱歉,如果这是一个陈旧的问题。

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

~/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)

2 个答案:

答案 0 :(得分:1)

错误 myname.utils.P 类无关,但是因为打印类没有包定义而发生错误。这意味着该类的实际全名是打印,但是如果从〜/ 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。

答案 1 :(得分:0)

这是因为您没有使用包名称。是的,当java给出错误并找不到类的包名时,它使用/。但是,应将其替换为.。因为包名称的某些部分始终用句点分隔,而不是用斜杠分隔。所以,如果我有一个包foo.bee。然后,当我试图运行

java foo.bee

它会在当前运行,但是如果我尝试了

java foo/bee

它会抱怨课程没有def错误。