java.lang.NoSuchMethodError的原因:线程“main”中的mainexception

新Java程序员在尝试运行Java程序时经常会遇到这样的消息:

java.lang.NoSuchMethodError: main Exception in thread "main" 

这是什么意思?是什么原因造成的?应该怎么办?

当您使用java命令从命令行运行Java应用程序时,例如,

  java some.AppName arg1 arg2 ... 

该命令会加载您提名的类,然后查找名为main的入口点方法。 更具体地说,它正在寻找一种方法,声明如下:

 package some; public class AppName { ... public static void main(String[] args) { // body of main method follows ... } } 

入口点方法的具体要求是:

  1. 该方法必须在指定的类。
  2. 该方法的名称必须是“主”, 正好大写1
  3. 该方法必须是public
  4. 该方法必须是static 2
  5. 该方法的返回types必须是void
  6. 该方法必须只有一个参数,参数的types必须是String[] 3

可以使用可变参数语法来声明参数。 例如String... args 。 请参阅https://stackoverflow.com/a/36803396/139985String[]参数用于从命令行传递参数,即使您的应用程序不包含命令行参数,也是必需的。

如果上述任何一个要求不满足, java命令将会失败,并显示以下消息:

 java.lang.NoSuchMethodError: main Exception in thread “main” 

如果遇到此错误,请检查您是否拥有main方法,并且是否满足上述所有要求。


1 – 当一个或多个“main”字符不是拉丁-1字符时,一个或多个字符变得非常模糊不清,但显示时却是一个与相应的LATIN-1字符相似的Unicode字符。

2 – 请参阅为什么Java主要方法是静态的? 为解释为什么该方法需要是静态的。

3 – String必须对应于java.lang.String而不是名为String的自定义类隐藏它。

问题是你没有在你试图调用的类中有一个public void main(String[] args)方法。

  • 必须是static
  • 必须只有一个string数组参数(可以是任何名称)
  • 必须拼写成小写。

注意,你已经指定了一个已经存在的类(否则错误将会不同),但是这个类缺less主要的方法。

其他答案在总结main需求方面做得很好。 我想收集这些要求logging在哪里的参考。

最权威的来源是VM规范(第二版引用)。 由于main不是语言特性,所以在Java语言规范中不考虑它。

  • 2.17.1执行 – 虚拟机启动
  • 5.2虚拟机启动

另一个很好的资源是应用程序启动器本身的文档:

  • java – Java应用程序启动器

如果你正在运行正确的类并且正确定义了main,那么还要检查在同一个包中是否定义了一个名为String的类。 这个String类的定义将被考虑,因为它不能确认main(java.lang.String[] args) ,你将得到相同的exception。

  • 这不是编译时错误,因为编译器只是假设你正在定义一个自定义的主要方法。

build议不要在你的包中隐藏库java类。

该例外的名称表明该程序试图调用一个不存在的方法。 在这种情况下,这听起来像程序没有一个main方法,但是如果您发布导致错误的代码以及运行代码的上下文,将会有所帮助。

如果用户试图运行.class文件或没有main方法的.jar文件,可能会发生这种情况 – 在Java中, main方法是开始执行程序的入口点。

通常情况下,编译器应该防止这种情况发生,所以如果发生这种情况,通常是因为被调用的方法的名称是由运行时确定的,而不是编译时。

为了解决这个问题,一个新的程序员必须添加midding方法(假设它仍然是main的), 或者将方法调用改为存在的方法的名字。

阅读更多关于这里的主要方法: http : //csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html

一般来说,这意味着您正在尝试运行的程序没有“主要”方法。 如果要执行一个Java程序,正在执行的类必须有一个main方法

例如,在文件Foo.java中

 public class Foo { public static void main(args[]) { System.out.println("hello"); } } 

这个程序应该编译和运行没有问题 – 如果main被调用别的东西,或者不是静态的,它会产生你遇到的错误。

每个可执行程序,不pipe语言如何,都需要一个入口点,告诉解释器,操作系统或机器从何处开始执行。 在Java的情况下,这是静态方法main ,它传递了包含命令行参数的参数args[]
它相当于C中的int main(int argc, char** argv)

我觉得上面的答案错过了即使你的代码有一个main()也会发生这个错误的场景。 当您使用使用reflection来调用方法的JNI时。 在运行期间如果找不到方法,你会得到一个

java.lang.NoSuchMethodError: No virtual method