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

新手上路,请多包涵

新的 Java 程序员在尝试运行 Java 程序时经常会遇到如下消息。 (不同的 Java 工具、IDE 等针对此问题提供了多种诊断方法。)


 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 not found in the file, please define the main method as:
   public static void main(String[] args)


 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"


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

原文由 Stephen C 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.8k
2 个回答

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

 java some.AppName arg1 arg2 ...

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

 package some;
public class AppName {
    ...
    public static void main(final 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 方法,并且它是否满足上面列出的所有六个要求。


1 - 一个真正晦涩的变体是“main”中的一个或多个字符不是 LATIN-1 字符……而是一个 Unicode 字符,在显示时 看起来像 相应的 LATIN-1 字符。

2 - 这里 解释了为什么该方法需要是静态的。

3 - String 必须是标准 java.lang.String 类,而不是隐藏标准类的名为 String 的自定义类。

原文由 Stephen C 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

原文由 Thorbjørn Ravn Andersen 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题