我在这里看过这样的问题,但我找不到一个特定于我情况的问题,很抱歉,如果这是一个陈旧的问题。
我有一个类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 :(得分: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错误。