“错误:在 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
。
方法必须是static
2。
方法的返回类型必须是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)
确认,你会得到同样的异常。
建议永远不要在包中隐藏库 java 类。
【讨论】:
【参考方案7】:其他答案在总结main
的要求方面做得很好。我想收集有关记录这些要求的参考资料。
最权威的来源是VM
规范(引用的第二版)。由于main
不是语言特性,Java 语言规范中没有考虑它。
另一个很好的资源是应用程序启动器本身的文档:
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 类中找不到主方法,请将主方法定义为...”的主要内容,如果未能解决你的问题,请参考以下文章