“错误:在MyClass类中找不到主要方法,请将主方法定义为……”

新Java程序员在尝试运行Java程序时经常会遇到这些消息。


Error: Main method not found in class MyClass, please define the main method as: public static void main(String[] args) or a JavaFX application class must extend javafx.application.Application 

 Error: Main method is not static in class MyClass, please define the main method as: public static void main(String[] args) 

 Error: Main method must return a value of type void in class MyClass, please define the main method as: public static void main(String[] args) 

 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. 方法的名称必须是“main”, 正好是大写1
  3. 该方法必须是public
  4. 该方法必须是static 2
  5. 方法的返回类型必须为void
  6. 该方法必须只有一个参数,而参数的类型必须是String[] 3

可以使用varargs语法声明参数;例如String... args 。有关更多信息,请参阅此问题 String[]参数用于从命令行传递参数,即使应用程序不接受命令也是必需的行参数。)

如果不满足上述任何一个要求,则java命令将失败并显示消息的某些变体:

 Error: Main method not found in class MyClass, please define the main method as: public static void main(String[] args) or a JavaFX application class must extend javafx.application.Application 

或者,如果您运行的是非常旧的Java版本:

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

如果遇到此错误,请检查您是否具有main方法,并且它满足上面列出的所有6个要求。


1 – 一个非常模糊的变化是当“main”中的一个或多个字符不是LATIN-1字符时…而是显示时看起来像对应的LATIN-1字符的Unicode字符。

2 – 请参阅为什么Java main方法是静态的? 解释为什么该方法必须是静态的。

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

问题是您尝试调用的类中没有public void main(String[] args)方法。

  • 必须是static
  • 必须只有一个String数组参数(可以命名为任何东西)
  • 必须用小写拼写为main。

请注意,您实际上已经指定了一个现有的类(否则错误会有所不同),但该类缺少main方法。

其他答案在总结main要求方面做得很好。 我想收集有关这些需求记录的参考资料。

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

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

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

  • java – Java应用程序启动器

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

  • 这不是编译时错误,因为编译器只是假定您正在定义自定义主方法。

建议永远不要在包中隐藏库java类。

exception的名称表明程序试图调用不存在的方法。 在这种情况下,它听起来像程序没有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被称为其他东西,或者不是静态的,它将产生你经历的错误。

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

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

java.lang.NoSuchMethodError: No virtual method