2011-03-23 61 views
48

新的Java程序员经常遇到这样的消息,当他们试图运行Java程序:原因“java.lang.NoSuchMethodError:线程‘main’主要的例外”

java.lang.NoSuchMethodError: main Exception in thread "main" 

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

+0

只是猜测他们称之为是不存在的功能,但是编译器应该阻止你,如果你做到这一点。 – eternalmatt 2011-03-23 15:04:20

+0

Wikic完成。 – 2011-03-23 15:07:13

+0

@eternalmatt - 这是编译器无法处理的情况。详情请参阅我的回答。 – 2014-10-08 06:09:26

回答

33

当您使用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. 该方法的名称必须是“主”正好即大写。
  3. 该方法必须是public
  4. 该方法必须是static
  5. 该方法的返回类型必须是void
  6. 该方法必须只有一个参数,参数的类型必须是String[]

的参数可以使用的可变参数的语法来声明;例如String... args。请参阅https://stackoverflow.com/a/36803396/139985String[]参数用于从命令行传递参数,并且即使应用程序不接受命令行参数也是必需的。

如果上述要求的任何一个条件不满足,则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隐藏它。

+3

该课程实际上并不需要公开。至少在实践中,我不知道也许有一个规范需要它,但'java'可以调用一个公共主方法的非公共类。 – 2011-03-23 15:46:26

+0

谢谢...更新。 – 2011-03-23 16:01:43

14

的问题是,你不必在你试图调用类public void main(String[] args)方法。

  • 必须static
  • 只能有一个字符串数组参数(其可以被命名为任何)
  • 必须以小写拼写米-A-英寸

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

3

异常的名称表明,该计划试图调用不存在的方法。在这种情况下,这听起来像程序没有main方法,但是如果您发布导致错误的代码和运行代码的上下文将会有所帮助。在Java中,main方法的入口点开始执行程序 -

此,如果用户试图运行一个.class文件或.jar文件没有main方法可能发生。

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

要解决这个问题,一个新的程序员必须添加的midding方法(假设仍然是它的main是不可少的)改变方法调用到不存在的方法的名称。

了解更多有关的主要方法在这里:http://csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html

+0

编译器无法处理这个问题。它不知道用户是否会*使用正在编译的类作为程序的“入口点”,因此是否存在适当的'main'方法*。 – 2014-10-08 06:12:04

1

一般情况下,这意味着你正在尝试运行没有一个“主”方法的程序。如果你要执行一个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

5

如果您运行的是正确的类和main被正确定义,同时检查你是否有一个在同一个包中定义的称为String的类。这个String类的定义将被考虑,并且由于它不确认到main(java.lang.String[] args),您将会得到相同的异常。

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

Suggestion is to never hide library java classes in your package.

0

感觉,甚至当你的代码有此错误发生一个main()以上的答案错过的场景。当您使用使用Reflection调用方法的JNI时。在运行时,如果没有找到方法,你会得到一个

java.lang.NoSuchMethodError: No virtual method

+0

这不是问题旨在解释的错误消息。该问题具体是关于缺少“主要”方法。 (请不要告诉我它不是......因为我写了它。)如果你想解决不同的情况,请随时打开一个不同的问题并自行回答。) – 2015-02-27 23:13:42

相关问题