java.lang.NoSuchMethodError的原因:线程“main”中的mainexception
新Java程序员在尝试运行Java程序时经常会遇到这样的消息:
java.lang.NoSuchMethodError: main Exception in thread "main"
这是什么意思?是什么原因造成的?应该怎么办?
当您使用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 。
- 该方法必须是
public
。 - 该方法必须是
static
2 。 - 该方法的返回types必须是
void
。 - 该方法必须只有一个参数,参数的types必须是
String[]
3 。
可以使用可变参数语法来声明参数。 例如String... args
。 请参阅https://stackoverflow.com/a/36803396/139985 。 String[]
参数用于从命令行传递参数,即使您的应用程序不包含命令行参数,也是必需的。
如果上述任何一个要求不满足, java
命令将会失败,并显示以下消息:
java.lang.NoSuchMethodError: main Exception in thread “main”
如果遇到此错误,请检查您是否拥有main
方法,并且是否满足上述所有要求。
1 – 当一个或多个“main”字符不是拉丁-1字符时,一个或多个字符变得非常模糊不清,但显示时却是一个与相应的LATIN-1字符相似的Unicode字符。
2 – 请参阅为什么Java主要方法是静态的? 为解释为什么该方法需要是静态的。
3 – String
必须对应于java.lang.String
而不是名为String
的自定义类隐藏它。
问题是你没有在你试图调用的类中有一个public void main(String[] args)
方法。
它
- 必须是
static
- 必须只有一个string数组参数(可以是任何名称)
- 必须拼写成小写。
注意,你已经指定了一个已经存在的类(否则错误将会不同),但是这个类缺less主要的方法。
其他答案在总结main
需求方面做得很好。 我想收集这些要求logging在哪里的参考。
最权威的来源是VM
规范(第二版引用)。 由于main
不是语言特性,所以在Java语言规范中不考虑它。
- 2.17.1执行 – 虚拟机启动
- 5.2虚拟机启动
另一个很好的资源是应用程序启动器本身的文档:
- java – Java应用程序启动器
如果你正在运行正确的类并且正确定义了main,那么还要检查在同一个包中是否定义了一个名为String的类。 这个String类的定义将被考虑,因为它不能确认main(java.lang.String[] args)
,你将得到相同的exception。
- 这不是编译时错误,因为编译器只是假设你正在定义一个自定义的主要方法。
build议不要在你的包中隐藏库java类。
该例外的名称表明该程序试图调用一个不存在的方法。 在这种情况下,这听起来像程序没有一个main
方法,但是如果您发布导致错误的代码以及运行代码的上下文,将会有所帮助。
如果用户试图运行.class
文件或没有main
方法的.jar
文件,可能会发生这种情况 – 在Java中, main
方法是开始执行程序的入口点。
通常情况下,编译器应该防止这种情况发生,所以如果发生这种情况,通常是因为被调用的方法的名称是由运行时确定的,而不是编译时。
为了解决这个问题,一个新的程序员必须添加midding方法(假设它仍然是main
的), 或者将方法调用改为存在的方法的名字。
阅读更多关于这里的主要方法: http : //csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html
一般来说,这意味着您正在尝试运行的程序没有“主要”方法。 如果要执行一个Java程序,正在执行的类必须有一个main
方法
例如,在文件Foo.java中
public class Foo { public static void main(args[]) { System.out.println("hello"); } }
这个程序应该编译和运行没有问题 – 如果main
被调用别的东西,或者不是静态的,它会产生你遇到的错误。
每个可执行程序,不pipe语言如何,都需要一个入口点,告诉解释器,操作系统或机器从何处开始执行。 在Java的情况下,这是静态方法main
,它传递了包含命令行参数的参数args[]
。
它相当于C中的int main(int argc, char** argv)
我觉得上面的答案错过了即使你的代码有一个main()也会发生这个错误的场景。 当您使用使用reflection来调用方法的JNI时。 在运行期间如果找不到方法,你会得到一个
java.lang.NoSuchMethodError: No virtual method