新的Java程序员经常遇到这样的消息,当他们试图运行Java程序:原因“java.lang.NoSuchMethodError:线程‘main’主要的例外”
java.lang.NoSuchMethodError: main Exception in thread "main"
这是什么意思,什么都可以导致它,以及应该怎么做才能解决它?
新的Java程序员经常遇到这样的消息,当他们试图运行Java程序:原因“java.lang.NoSuchMethodError:线程‘main’主要的例外”
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
...
}
}
为切入点方法的具体要求是:
public
。static
。void
。String[]
。的参数可以使用的可变参数的语法来声明;例如String... args
。请参阅https://stackoverflow.com/a/36803396/139985。 String[]
参数用于从命令行传递参数,并且即使应用程序不接受命令行参数也是必需的。
如果上述要求的任何一个条件不满足,则java
命令将失败与消息:
java.lang.NoSuchMethodError: main Exception in thread “main”
如果遇到此错误,请检查你有一个main
方法,它满足所有6的上述要求。
1 - 的这个人真的不起眼的变化是,当一个或多个“主”的人物不是一个LATIN-1字符...但一个Unicode字符看起来像相应LATIN显示时为-1个字符。
2 - 见Why is the Java main method static?为什么需要该方法是静态的解释。
3 - String
必须对应于java.lang.String
而不是一个自定义类名为String
隐藏它。
该课程实际上并不需要公开。至少在实践中,我不知道也许有一个规范需要它,但'java'可以调用一个公共主方法的非公共类。 – 2011-03-23 15:46:26
谢谢...更新。 – 2011-03-23 16:01:43
的问题是,你不必在你试图调用类public void main(String[] args)
方法。
它
static
请注意,您已经指定了一个现有的类(否则错误将会不同),但该类缺少主要方法。
异常的名称表明,该计划试图调用不存在的方法。在这种情况下,这听起来像程序没有main
方法,但是如果您发布导致错误的代码和运行代码的上下文将会有所帮助。在Java中,main
方法的入口点开始执行程序 -
此,如果用户试图运行一个.class
文件或.jar
文件没有main
方法可能发生。
通常情况下,编译器应该防止这种情况发生,所以如果发生这种情况,这通常是因为得到确定被调用的方法的名称AR运行时,而不是编译时。
要解决这个问题,一个新的程序员必须添加的midding方法(假设仍然是它的main
是不可少的)或改变方法调用到不存在的方法的名称。
了解更多有关的主要方法在这里:http://csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html
编译器无法处理这个问题。它不知道用户是否会*使用正在编译的类作为程序的“入口点”,因此是否存在适当的'main'方法*。 – 2014-10-08 06:12:04
一般情况下,这意味着你正在尝试运行没有一个“主”方法的程序。如果你要执行一个java程序,正在执行的类必须有一个main
方法
例如,文件中Foo.java
public class Foo {
public static void main(args[]) {
System.out.println("hello");
}
}
这个程序应编译和运行没有问题 - 如果main
被称为别的东西,或者不是静态的,它会产生你遇到的错误。
每一个可执行程序,无论语言,需要一个切入点,来告诉解释器,操作系统或机器从哪里开始执行。在Java的情况下,这是静态方法main
,它通过了包含命令行参数的参数args[]
。
它相当于int main(int argc, char** argv)
用C
其他答案在总结main
的要求方面做得很好。我想收集这些需求记录在何处的参考。
最权威的来源是规范(引用第二版)。由于main
不是一种语言功能,因此在Java语言规范中不予考虑。
另一个很好的资源是应用程序启动器本身的文档:
如果您运行的是正确的类和main被正确定义,同时检查你是否有一个在同一个包中定义的称为String的类。这个String类的定义将被考虑,并且由于它不确认到main(java.lang.String[] args)
,您将会得到相同的异常。
Suggestion is to never hide library java classes in your package.
感觉,甚至当你的代码有此错误发生一个main()以上的答案错过的场景。当您使用使用Reflection调用方法的JNI时。在运行时,如果没有找到方法,你会得到一个
java.lang.NoSuchMethodError: No virtual method
这不是问题旨在解释的错误消息。该问题具体是关于缺少“主要”方法。 (请不要告诉我它不是......因为我写了它。)如果你想解决不同的情况,请随时打开一个不同的问题并自行回答。) – 2015-02-27 23:13:42
只是猜测他们称之为是不存在的功能,但是编译器应该阻止你,如果你做到这一点。 – eternalmatt 2011-03-23 15:04:20
Wikic完成。 – 2011-03-23 15:07:13
@eternalmatt - 这是编译器无法处理的情况。详情请参阅我的回答。 – 2014-10-08 06:09:26