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

Ste*_*n C 58 java program-entry-point runtime-error nosuchmethoderror

新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
Run Code Online (Sandbox Code Playgroud)
Error: Main method is not static in class MyClass, please define the main method as:
   public static void main(String[] args)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
java.lang.NoSuchMethodError: main
Exception in thread "main"
Run Code Online (Sandbox Code Playgroud)

这是什么意思,什么可以导致它,以及应该怎么做才能解决它?

Ste*_*n C 39

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

java some.AppName arg1 arg2 ...
Run Code Online (Sandbox Code Playgroud)

该命令加载您指定的类,然后查找调用的入口点方法main.更具体地说,它正在寻找声明如下的方法:

package some;
public class AppName {
    ...
    public static void main(final String[] args) {
        // body of main method follows
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 该方法必须在提名类中.
  2. 该方法的名称必须是"main",并且具有该大小写1.
  3. 方法必须是public.
  4. 方法必须是static 2.
  5. 方法的返回类型必须是void.
  6. 该方法必须只有一个参数,参数的类型必须为String[] 3.

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

java.lang.NoSuchMethodError: main
Exception in thread "main"
Run Code Online (Sandbox Code Playgroud)

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


1 - 一个非常模糊的变化是当"main"中的一个或多个字符不是LATIN-1字符时......但是显示时看起来像对应的LATIN-1字符的Unicode字符.

2 - 请参阅为什么Java main方法是静态的?用于解释为什么该方法必须是静态的.

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


Tho*_*sen 14

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

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

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


Mar*_*ers 8

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

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

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


bsc*_*han 5

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

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

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