2015-09-27 32 views
-1

我今天刚开始的Java运行,我得到一个NoClassDefFoundError的运行我的代码:确实需要的Java .class文件,即使定义

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是否需要.class文件进行编译和运行,尽管在程序中定义了类本身,为什么?我还内置了.java文件通过终端和它工作得很好

+1

学生课在哪里? – RayanFar

+5

您不能运行.java文件,它只是一段文本。你需要一个.class文件。 – laune

+0

.java包含代码,而.class包含由JVM解释的字节码。运行该程序所需的所有类都应位于CLASSPATH中。 – Kishore

回答

2

编译和执行是两个步骤的过程:

  • 在编译期间相Java编译器将源代码编译并生成bytecode。该中间体bytecode.class file的形式保存。

  • 在第二阶段,也称为Java解释器的Java虚拟机(JVM)以.class作为输入并通过执行bytecode生成输出。

所以是.class文件是执行代码所必需的。 .java文件是您编写的文本,但不是本机可以解释的内容。

这里是发生了什么流程图:

enter image description here

要看看它在更深入:

当您的Java项目的基础,其转换的源代码(包含在*.java源文件)到Java bytecode(通常包含在*.class文件中)。这使您的高级代码更接近机器代码,但尚未完成。 这个bytecode是一个紧凑的指令集合;机器更容易解读,但可读性更差。

当您在您的计算机,手机或任何其他支持Java的平台上运行Java应用程序时,基本上将此Java bytecode传递给Java虚拟机。 Java虚拟机中的解释器通常在运行时开始编译整个bytecode,遵循所谓的即时编译的原则。这使得打开一个Java应用程序时,虽然通常稍微有点延迟,但通常会提高程序的性能,而不是解释性编译。

1

确实需要的Java .class文件编译和运行尽管有本身在程序中定义的类,为什么

的编译输出一个java文件(类)是.class文件。它包含由JVM运行的程序的bytecode。因此需要.class文件来运行该程序。

我还通过建立终端java文件,它甚至可以通过终端运行良好

,当您编译.java文件(类)。它为.java文件中声明的每个类创建.class。然后执行包含main方法的类。 main方法是JVM的入口点。

例如:
文件名: example.java
编译代码: javac的example.java
输出是.class文件:Example.class。因为班级的名字是Example
运行程序: Java示例

错误在你的代码。 看起来这个问题已经更新了。

System.out.format("%s", Student.greeting); 

类的名称,是ExampleStudent。它应该是:Java程序的

System.out.format("%s", Example.greeting); 
相关问题