gpt4 book ai didi

Java NoClassDefFoundError 与继承类

转载 作者:太空宇宙 更新时间:2023-11-04 07:31:13 24 4
gpt4 key购买 nike

我最近开始学习 Java,但是遇到了一些与 NoClassDefFoundError 相关的问题。我尝试从该网站和其他地方研究解决方案,但仍然无法解决它们。我使用 CLASSPATH 环境变量集从 Windows 7 命令提示符运行程序,而不是为每个程序运行定义它。它设置为C:。为了排除故障,我创建了一个具有简化目录结构的测试包。

C:\test中,我有Shape.javaCircle.javaShape.java 看起来像这样:

package test;

class Shape {
void draw() { System.out.println("Drawing a new shape"); }
}

Circle.java看起来像这样:

package test;

public class Circle extends Shape {
public static void main(String[] args) {
Circle round = new Circle();
round.draw();
}
}

如果我在命令提示符下使用类似操作从 C:\ 编译 Shape.javaCircle.java

C:\>javac test\Shape.java 
C:\>javac test\Circle.java

并运行编译后的Circle.class文件,例如

C:\java test\Circle

我得到了我期望的输出:

Drawing a new shape

但是,如果我从 C:\test 内部编译 Shape.javaCircle.java ,就像

C:\test>javac Shape.java 
C:\test>javac Circle.java

然后尝试从任何地方运行Circle.class

C:\test>java Circle

或者像这样

C:\> java test\Circle

我收到以下错误消息。

Exception in thread "main" java.lang.NoClassDefFoundError: Circle (wrong name: t
est/Circle)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
2)
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:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

有人可以解释为什么 JAVA 文件是从 C:\test 文件夹中编译的,但编译后的 Circle 文件会产生该错误?我的 CLASSPATH 有问题吗?感谢您的阅读以及您希望即将推出的解决方案!

编辑:我做了更多测试,结果发现,如果我从 C:\test 目录编译 Shape.javaCircle.java 文件,但从 C:\ 目录运行它,它就可以工作。这会改变什么吗?

编辑2:经过更多测试,事实证明,只要我使用命令java test.Circle,我实际上就可以从C:\test目录中编译并运行Shape.java和Circle.java文件。我误解了 JVM 查找类的方式。我现在明白它在分析包导入语句时使用与编译器相同的方法。

最佳答案

只要您的类路径限制在 .

中,您就可以位于系统上的任何位置。

只有这样,java虚拟机才能扫描类路径,并在包test中找到类test.Circle

因此,正确的执行是java test.Circle(始终),并且类路径需要指向可以使用\test\Circle.class的内容。检查 Circle.class 是否位于您期望的位置。

关于Java NoClassDefFoundError 与继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17649914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com