新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"
这是什么意思,什么可以导致它,以及应该怎么做才能解决它?
答案 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
...
}
}
入口点方法的具体要求是:
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
方法并且它满足上面列出的所有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
请注意,您实际上已经指定了一个现有的类(否则错误会有所不同),但该类缺少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)
答案 8 :(得分:-1)
几分钟前,我遇到了“未定义main方法”。现在,它已解决。我尝试了上述所有操作,但没有任何效果。java文件中没有编译错误。 我遵循下面的事情
现在解决了问题。获得所需的结果。