2015-02-06 100 views
1

我已经在这里看到类似这样的问题,但我找不到特定于我的情况的问题,所以很遗憾,如果这是一个破旧的问题。NoClassDefFoundError Java(错误的名称)

我有一个类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) 
+0

它应该是'java myname.practice.Printing',假设它在名为'myname.practice'的包中。 – BackSlash 2015-02-06 16:58:38

+0

获取P类的副本,将其放入包中,并在开始时添加一个'package'语句,以将其标记为属于您的包。然后,一切都应该正常工作。 – 2015-02-06 16:59:14

+0

你有任何这样的源代码? – dcsohl 2015-02-06 17:13:32

回答

0

这是因为你不使用包名。是的,当java给出的错误和未找到类的包名时,它使用/。但是这些应该用.代替。因为包名称的一部分总是以句点分隔,而且从不以斜线分隔。所以如果我有一个包foo.bee。然后,当我试图运行

java foo.bee

它将目前运行的所有,但是如果我试图

java foo/bee

它会抱怨一类不DEF错误。

1

错误相关myname.utils.P类,但它是因为印刷类没有包定义。这意味着该类的真实全名是打印,但是如果从〜/ JavaClasses文件夹启动java命令,则说明Printing类的全名是myname.practice.Printing

您有2个选项来解决这个问题:

1)声明myname.practice包装印刷类中(我的建议是一个)

2)添加myname.practice文件夹到类路径中,以这样的方式

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

.代表当前目录,所以你仍然可以参考,有必要从〜/ JavaClasses文件夹中的myname.utils.P类。

附注。在编译时你没有错误,因为当你启动javac和当前使用的文件夹时,你可能没有指定类路径。通过这种方式,myname.utils.P即使通过Printing也可以在每个班级都没有问题的情况下被引用。

相关问题