从命令行运行java程序时,在线程“main”java.lang.NoClassDefFoundError'中出现异常

时间:2010-03-02 22:06:15

标签: java

我在这里做错了什么:

class Helo { 
   // main: generate some simple output 
   public static void main (String[] args) { 
      System.out.println ("Hello, world."); // print one line 
      System.out.println ("How are you?"); // print another 
   } 
} 

当我进入终端时,我会这样做:

cd ~
javac Atempt2.java (//that's the file name) 
java Atempt2 

然后它给了我这个错误信息:

Exception in thread "main" java.lang.NoClassDefFoundError: Atempt2

所有这一切都是我做的和发生的事情:

david-allenders-macbook-pro:~ davidallender$ cd ~
david-allenders-macbook-pro:~ davidallender$ javac Atempt2.java
david-allenders-macbook-pro:~ davidallender$ java Atempt2
Exception in thread "main" java.lang.NoClassDefFoundError: Atempt2
david-allenders-macbook-pro:~ davidallender$ 

我是新手,所以请以非常简单的方式解释。

感谢。

7 个答案:

答案 0 :(得分:9)

自从我完成任何java工作以来已经有一段时间了,但我很确定你的类名需要与你的文件名相匹配。

答案 1 :(得分:7)

javac使用类名生成输出而不是文件名。 所以它会生成一个Helo.class类文件 java将取一个类名并在相应的类文件中调用main函数,这里是Hello.class。

抛出ClassNotFoundError是因为javac从未生成Atemp2类文件,因为源文件中没有Atemp2类。

答案 2 :(得分:6)

将您的Atempt2.java重命名为Hello.java以便继续,然后:

javac Helo.java
java Helo

请参阅here for more discussion and the reasoning

答案 3 :(得分:3)

变化:

class Helo

class Atempt2

在源文件中。

声明类的.java文件必须具有与声明的类名匹配的文件名。

答案 4 :(得分:1)

文件名必须与文件中定义的public class的名称相匹配。在这种情况下,您要么必须将文件命名为“Helo.java”,要么将该类重命名为Atempt2

答案 5 :(得分:1)

这是从java编程开始的最基本的。你编写的任何程序文件的名称必须与程序的公共类相匹配。 在你的程序中,文件的公共类是Helo,所以你的文件名必须是Helo.java.Here编译器能够编译但JVM将搜索Helo.class文件来运行。由于没有Helo.class文件,您在线程“main”中获得运行时异常异常java.lang.NoClassDefFoundError:Atempt2

答案 6 :(得分:1)

补充 josefx 的答案。

编译器的参数(javac)是要编译的文件的名称(正如您所做的那样)。

另一方面,虚拟机(java)获取要执行main方法的类的名称。

一个选项是

javac Atempt2.java    // the file name
java Helo             // the class name

通常,以与该类相同的方式命名文件是个好主意。对于public class,这是必须的(由编译器检查)。