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

Posted

技术标签:

【中文标题】“错误:在 MyClass 类中找不到主方法,请将主方法定义为...”【英文标题】:"Error: Main method not found in class MyClass, please define the main method as..." 【发布时间】:2011-07-21 09:43:03 【问题描述】:

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

这是什么意思,是什么原因造成的,应该怎么做才能修复它?

【问题讨论】:

只是猜测他们正在调用一个不存在的函数,但如果你这样做,编译器应该会阻止你。 @eternalmatt - 这是编译器无法处理的情况。详情见我的回答。 【参考方案1】:

当您使用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
        ...
    

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

    方法必须在指定的类中。 方法的名称必须是“main”,正好大写1。 方法必须是public。 方法必须是static2。 方法的返回类型必须是void。 方法必须只有一个参数,参数类型必须是String[]3

(参数可以使用varargs语法声明;例如String... args。有关更多信息,请参阅this question。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 - Here 解释了为什么要求该方法是静态的。 3 - String 必须对应于 java.lang.String 而不是名为 String 的自定义类隐藏它。

【讨论】:

【参考方案2】:

如果你使用的是 VSCode:

选择:清洁工作区

选择:重启并删除

继续编码:-)

【讨论】:

请注意,除非应用程序确实具有正确编写的入口点类,否则这种方法(重新同步您的 IDE)将不起作用。【参考方案3】:

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

例如,在文件 Foo.java 中

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

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

那么真正的原因是什么?在我看来,这听起来像是您没有正确构建应用程序。如果您考虑一下,这可能是 *** 上几乎所有编程问题的答案!但我们一般不会提及... 我使用 maven 构建它,但在 eclipse 中它没有这样做。【参考方案5】:

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

java.lang.NoSuchMethodError: No virtual method

【讨论】:

这不是问题旨在解释的错误消息。该问题专门针对缺少的“主要”方法。 (请不要告诉我这不是……因为我写的。)如果您想解决不同的情况,请随时打开不同的问题并自行回答。)【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

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

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

2.17.1 Execution - Virtual Machine Start-up 5.2 Virtual Machine Start-up

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

java - the Java application launcher

【讨论】:

【参考方案8】:

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

必须是static 必须只有一个字符串数组参数(可以任意命名) 必须小写 m-a-i-n。

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

【讨论】:

【参考方案9】:

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

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

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

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

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

【讨论】:

编译器无法处理这个问题。它不知道用户是否打算使用它正在编译的类作为程序的“入口点”,因此不知道适当的main 方法是否应该 存在。

以上是关于“错误:在 MyClass 类中找不到主方法,请将主方法定义为...”的主要内容,如果未能解决你的问题,请参考以下文章