【问题标题】:'Exception in thread "main" java.lang.NoClassDefFoundError' when running java program from command line从命令行运行 java 程序时,线程“main”java.lang.NoClassDefFoundError 出现异常
【发布时间】:2011-01-22 22:57:31
【问题描述】:

我在这里做错了什么:

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$ 

我对此很陌生,所以请用非常简单的方式解释一下。

谢谢。

【问题讨论】:

  • 你在学习什么教程?你在哪里见过这样的代码示例?
  • 我强烈建议您遵循供应商自己的“涵盖基础知识的路径”java.sun.com/docs/books/tutorial
  • @David:这里发布的许多答案要么是错误的,要么具有误导性;请看我的大部分cmets。我认为最好的答案是 josefx 的答案:stackoverflow.com/questions/2367185/whats-wrong-here/…
  • @mmyers:+1 为教育人们所做的努力。 :-)

标签: java


【解决方案1】:

我已经有一段时间没有做任何 java 工作了,但我很确定你的类名需要与你的文件名匹配。

【讨论】:

  • 这是我今天第二次看到这种说法了,还是错了。 公共类必须与文件名匹配,但贴出的代码不是公共类。
  • @mmyers:是的,你说得对,贴出的代码不是公共类,但主要方法必须在程序的公共类中。
  • @girnie:不,这也不是真的;具有 main 方法的类可以是包私有的。我会向您推荐我对 skaffman 答案的评论,但答案已被删除。
【解决方案2】:

将您的 Atempt2.java 重命名为 Hello.java 以开始操作,然后:

javac Helo.java
java Helo

here for more discussion and the reasoning

【讨论】:

  • 或在文件Atempt2中命名类
  • 重命名可以解决问题,但并不能说明现在发生了什么。
【解决方案3】:

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

【讨论】:

  • 这是对的,但是文件中没有定义public class,这使得它与当前的问题无关。
【解决方案4】:

改变:

class Helo

class Atempt2

在您的源文件中。

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

【讨论】:

  • 不太正确;请参阅我对罗伯特戴维斯回答的评论。
【解决方案5】:

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

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

【讨论】:

  • +1:这是迄今为止发布的唯一正确答案,不会误导 OP。
【解决方案6】:

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

【讨论】:

    【解决方案7】:

    补充 josefx 的回答。

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

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

    一个选项是

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多