Подтвердить что ты не робот

Причины 'java.lang.NoSuchMethodError: main Исключение в потоке "main"

Новые Java-программисты часто сталкиваются с этим сообщением при попытке запустить программу Java:

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

Что это значит, что может вызвать это, и что нужно сделать, чтобы исправить это?

4b9b3361

Ответ 1

Когда вы используете команду 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.
  • Тип возвращаемого метода должен быть 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, скрывающему его.

Ответ 2

Проблема заключается в том, что у вас нет метода public void main(String[] args) в классе, который вы пытаетесь вызвать.

Это

  • должен быть static
  • должен иметь ровно один аргумент массива String (который может быть назван любым)
  • должен быть записан m-a-i-n в нижнем регистре.

Обратите внимание, что вы действительно указали существующий класс (иначе ошибка была бы другой), но в этом классе отсутствует основной метод.

Ответ 3

Другие ответы хорошо отражают требования main. Я хочу собрать ссылки на то, где эти требования документированы.

Наиболее авторитетным источником является спецификация VM (цитируется второе издание). Поскольку main не является языковой функцией, он не учитывается в Спецификации языка Java.

Другим хорошим ресурсом является документация для самого запуска приложения:

Ответ 4

Если вы используете правильный класс, а основное задано правильно, проверьте также, есть ли у вас класс String, определенный в том же пакете. Это определение класса String будет рассмотрено и, поскольку оно не подтверждает main(java.lang.String[] args), вы получите то же исключение.

  • Это не ошибка времени компиляции, поскольку компилятор просто предполагает, что вы определяете настраиваемый основной метод.

Предложение состоит в том, чтобы никогда не скрывать классы библиотеки Java в вашем пакете.

Ответ 5

Имя исключения указывает, что программа пыталась вызвать метод, который не существует. В этом контексте, похоже, что у программы нет метода main, хотя это поможет, если вы разместите код, вызвавший ошибку и контекст, в котором был запущен код.

Это могло произойти, если пользователь попытался запустить файл .class или .jar, который не имеет метода main - в Java, метод main - это точка входа, чтобы начать выполнение программы.

Обычно компилятор должен предотвращать это, поэтому, если это происходит, обычно это происходит потому, что имя вызываемого метода определяется временем выполнения ar, а не компиляцией.

Чтобы устранить эту проблему, новый программист должен либо добавить метод торможения (предположив, что он main отсутствует), либо изменить вызов метода на имя метода, который существует.

Подробнее об основном методе здесь: http://csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html

Ответ 6

Как правило, это означает, что программа, которую вы пытаетесь запустить, не имеет "основного" метода. Если вы собираетесь выполнить 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

Ответ 7

Я чувствую, что вышеупомянутые ответы пропускают сценарий, где эта ошибка возникает, даже если ваш код имеет основной(). Когда вы используете JNI, который использует Reflection для вызова метода. Во время выполнения, если метод не найден, вы получите

java.lang.NoSuchMethodError: No virtual method