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

时间:2011-03-23 15:02:28

标签: java runtime-error main 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

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"

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

9 个答案:

答案 0 :(得分:37)

使用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
  7. (参数可以使用varargs语法声明;例如String... args。有关详细信息,请参阅this questionString[]参数用于传递参数从命令行开始,即使您的应用程序不使用命令行参数,也是必需的。)

    如果不满足上述任何一项要求,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字符...但是看起来像的Unicode字符显示时对应的LATIN-1字符。

    2 - 请参阅Why is the Java main method static?,了解为何该方法必须是静态的。

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

答案 1 :(得分:14)

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

  • 必须为static
  • 必须只有一个String数组参数(可以命名为任何内容)
  • 必须用小写拼写m-a-i-n。

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

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:5)

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

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

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

答案 4 :(得分:3)

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

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

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

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

在此处详细了解主要方法:http://csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html

答案 5 :(得分:1)

通常,这意味着您尝试运行的程序没有“主”方法。如果要执行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)

答案 6 :(得分:0)

我觉得上面的答案错过了即使您的代码有main()也会发生此错误的情况。当您使用使用Reflection来调用方法的JNI时。在运行期间,如果找不到该方法,您将获得

java.lang.NoSuchMethodError: No virtual method

答案 7 :(得分:0)

如果您使用的是 VSCode:

enter image description here

选择:清理工作区

enter image description here

选择:重启并删除

继续编码:-)

答案 8 :(得分:-1)

几分钟前,我遇到了“未定义main方法”。现在,它已解决。我尝试了上述所有操作,但没有任何效果。java文件中没有编译错误。 我遵循下面的事情

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

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