it-swarm.com.ru

"Ошибка: метод Main не найден в классе MyClass, определите метод main как ..."

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


Error: Main method not found in class MyClass, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

Error: Main method is not static in class MyClass, please define the main method as:
   public static void main(String[] args)

Error: Main method must return a value of type void in class MyClass, please
define the main method as:
   public static void main(String[] args)

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

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

53
Stephen C

Когда вы используете команду 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. Имя метода должно быть «основным» с точно, что заглавными буквами1,.
  3. Метод должен быть public.
  4. Метод должен быть static 2,.
  5. Тип возвращаемого значения метода должен быть void.
  6. Метод должен иметь ровно один аргумент, а тип аргумента должен быть String[] 3

(Аргумент может быть объявлен с использованием синтаксиса varargs; например, String... args. См. этот вопрос для получения дополнительной информации. Аргумент String[] используется для передачи аргументов из командной строки и требуется, даже если ваше приложение принимает без аргументов командной строки.)

Если какое-либо из указанных выше требований не будет выполнено, команда Java завершится ошибкой с некоторым вариантом сообщения:

Error: Main method not found in class MyClass, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

Или, если вы используете чрезвычайно старую версию Java:

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

Если вы столкнулись с этой ошибкой, убедитесь, что у вас есть метод main и он удовлетворяет всем 6 требованиям, перечисленным выше.


1 - Один действительно неясный вариант этого случая, когда один или несколько символов в "main" - это НЕ символ LATIN-1 ... но символ Unicode, который выглядит как соответствующий символ LATIN-1 при отображении.

2 - Смотрите Почему основной метод Java статичен? для объяснения того, почему метод должен быть статическим.

3 - String должен соответствовать Java.lang.String, а не настраиваемый класс с именем String, скрывающий его.

37
Stephen C

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

Это 

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

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

14
Thorbjørn Ravn Andersen

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

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

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

8
Mark Peters

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

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

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

5
bschandramohan

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

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

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

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

Узнайте больше о методе main здесь: http://csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html

3
FrustratedWithFormsDesigner

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

1
Magnus

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

Java.lang.NoSuchMethodError: No virtual method

0
likejudo

Несколько минут назад я столкнулся с «основным методом, не определенным». Теперь он решен. Я попробовал все вышеперечисленное, но ничего не работало. В моем Java-файле не было ошибки компиляции.

  • просто сделал maven update во всех зависимых проектах (alt + F5).

Теперь проблема решена. Получение необходимого результата.

0
Raj Kumar Mishra