62

新的 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"

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

4

9 回答 9

44

当您使用该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隐藏标准类的自定义类。

于 2011-03-23T15:30:02.737 回答
14

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

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

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

于 2011-03-23T15:04:27.703 回答
8

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

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

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

于 2011-03-23T15:58:29.490 回答
5

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

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

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

于 2013-03-12T16:04:32.700 回答
3

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

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

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

要解决此问题,新程序员必须添加中间方法(假设仍然main缺少该方法)将方法调用更改为确实存在的方法的名称。

在此处阅读有关主要方法的更多信息:http: //csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html

于 2011-03-23T15:04:39.740 回答
2

通常,这意味着您尝试运行的程序没有“main”方法。如果你要执行一个 Java 程序,被执行的类必须有一个main方法:

例如,在文件 Foo.java

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

该程序应该可以编译并运行没有问题 - 如果main被称为其他东西,或者不是静态的,它会产生您遇到的错误。

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

于 2011-03-23T15:12:38.807 回答
0

我觉得上面的答案错过了即使您的代码具有 main() 也会发生此错误的情况。当您使用使用反射调用方法的 JNI 时。在运行时如果没有找到方法,你会得到一个

java.lang.NoSuchMethodError: No virtual method

于 2015-02-27T16:19:58.510 回答
0

如果您使用的是 VSCode:

在此处输入图像描述

选择:清洁工作区

在此处输入图像描述

选择:重启并删除

继续编码:-)

于 2021-06-03T13:10:29.167 回答
-1

几分钟后我面临“未定义主要方法”。现在它已解决。我尝试了以上所有方法,但没有任何效果。我的 java 文件中没有编译错误。我跟着下面的事情

  • 只是在所有依赖项目中进行了 maven 更新(alt+F5)。

现在问题解决了。得到所需的结果。

于 2018-10-24T10:35:18.107 回答