Новые Java-программисты часто сталкиваются с этим сообщением при попытке запустить программу Java:
java.lang.NoSuchMethodError: main Exception in thread "main"
Что это значит, что может вызвать это, и что нужно сделать, чтобы исправить это?
Новые 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
...
}
}
Конкретными требованиями для метода точки входа являются:
public
.static
2.void
.String[]
3.Аргумент может быть объявлен с использованием синтаксиса varargs; например String... args
. См. fooobar.com/questions/1984/.... Аргумент String[]
используется для передачи аргументов из командной строки и требуется, даже если ваше приложение не принимает аргументы командной строки.
Если какое-либо из вышеперечисленных требований не выполняется, команда java
завершится с сообщением:
java.lang.NoSuchMethodError: main Exception in thread "main"
Если вы столкнулись с этой ошибкой, убедитесь, что у вас есть метод main
и что он удовлетворяет всем 6 из перечисленных выше требований.
1 - Один действительно неясный вариант этого заключается в том, что один или несколько символов в "main" не являются символами LATIN-1... но являются символом Unicode, который выглядит как соответствующий символ LATIN-1, когда отображается.
2 - См. Почему главный метод Java static? объясняет, почему метод должен быть статическим.
3 - String
должен соответствовать java.lang.String
, а не пользовательскому классу с именем String
, скрывающему его.
Проблема заключается в том, что у вас нет метода public void main(String[] args)
в классе, который вы пытаетесь вызвать.
Это
static
Обратите внимание, что вы действительно указали существующий класс (иначе ошибка была бы другой), но в этом классе отсутствует основной метод.
Другие ответы хорошо отражают требования main
. Я хочу собрать ссылки на то, где эти требования документированы.
Наиболее авторитетным источником является спецификация VM
(цитируется второе издание). Поскольку main
не является языковой функцией, он не учитывается в Спецификации языка Java.
Другим хорошим ресурсом является документация для самого запуска приложения:
Если вы используете правильный класс, а основное задано правильно, проверьте также, есть ли у вас класс String, определенный в том же пакете. Это определение класса String будет рассмотрено и, поскольку оно не подтверждает main(java.lang.String[] args)
, вы получите то же исключение.
Предложение состоит в том, чтобы никогда не скрывать классы библиотеки Java в вашем пакете.
Имя исключения указывает, что программа пыталась вызвать метод, который не существует. В этом контексте, похоже, что у программы нет метода main
, хотя это поможет, если вы разместите код, вызвавший ошибку и контекст, в котором был запущен код.
Это могло произойти, если пользователь попытался запустить файл .class
или .jar
, который не имеет метода main
- в Java, метод main
- это точка входа, чтобы начать выполнение программы.
Обычно компилятор должен предотвращать это, поэтому, если это происходит, обычно это происходит потому, что имя вызываемого метода определяется временем выполнения ar, а не компиляцией.
Чтобы устранить эту проблему, новый программист должен либо добавить метод торможения (предположив, что он 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
было вызвано чем-то другим или не было статическим, оно создало бы ошибку, с которой вы столкнулись.
Каждой исполняемой программе, независимо от языка, нужна точка входа, чтобы сообщить интерпретатору, операционной системе или машине, где начать выполнение. В случае Java это статический метод main
, которому передается параметр args[]
, содержащий аргументы командной строки.
он эквивалентен int main(int argc, char** argv)
в C
Я чувствую, что вышеупомянутые ответы пропускают сценарий, где эта ошибка возникает, даже если ваш код имеет основной(). Когда вы используете JNI, который использует Reflection для вызова метода. Во время выполнения, если метод не найден, вы получите
java.lang.NoSuchMethodError: No virtual method