我今天刚刚启动Java,运行代码时出现NoClassDefFoundError:
class Example {
public static final String greeting = "Hi there";
public static void main(String[] args) {
System.out.format("%s", Example.greeting);
}
}
以上是我的example.java
代码的内容。这段代码在Eclipse执行中编译得很好,但是当我尝试自己运行example.java
时,它会失败。当我运行这个程序时,Eclipse还创建了一些.class
文件,但如果我在另一个目录中运行.java
,那么为什么它会失败是没有多大意义的。 class Example
文件中可以找到.java
的信息。
尽管在程序中定义了类本身,但Java是否需要编译和运行.class
文件?为什么?我还通过终端构建了.java
文件,它运行良好
答案 0 :(得分:2)
编写和执行Java程序是两个步骤:
在编译阶段,Java编译器编译源代码并生成bytecode
。此中间bytecode
以.class file
的形式保存。
在第二阶段,Java虚拟机(JVM)也称为Java解释器,将.class
作为输入,并通过执行bytecode
生成输出。
所以是.class
文件对于执行代码至关重要。 .java
文件是您编写的文本,但不是机器可以解释的文件。
以下是发生的事情的流程图:
更深入地了解一下:
当您的Java项目构建时,它会将源代码(包含在*.java
源文件中)转换为Java bytecode
(通常包含在*.class
文件中)。这使您的高级代码更接近机器代码,但尚未完成。 此bytecode
是紧凑指令的集合;机器更易于理解,但可读性较差。
当您在计算机,手机或任何其他支持Java的平台上运行Java应用程序时,您实际上将此Java bytecode
传递给Java虚拟机。 Java虚拟机中的解释器通常在运行时开始编译整个bytecode
,遵循所谓的实时编译的原则。这在打开Java应用程序时会产生典型的(通常是轻微的延迟),但与解释的编译相比通常会提高程序性能。
答案 1 :(得分:1)
Java是否需要编译和运行.class文件,尽管程序中已经定义了类本身以及为什么
java文件(类)的编译输出是.class
文件。它包含由JVM运行的程序的bytecode
。因此运行该程序需要.class
个文件。
我还通过终端构建了.java文件,它运行良好
即使通过终端,编译.java
文件(类)时也是如此。它为.class
文件中声明的每个类创建.java
。然后执行包含main
方法的类。 main
方法是JVM的入口点。
例如:
文件名: example.java
编译代码: javac example.java
输出为.class文件:Example.class
。因为班级名称是Example
运行程序: java示例
代码出错。 在问题中看起来已经更新了。
System.out.format("%s", Student.greeting);
班级名称为Example
而不是Student
。它应该是:
System.out.format("%s", Example.greeting);