"Ошибка: метод 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"

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

10 ответов

Решение

Когда вы используете 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 скрывая это

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

Это

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

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

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

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

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

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

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

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

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

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

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

Чтобы решить эту проблему, новый программист должен либо добавить метод midding (при условии, что это 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) в С

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

java.lang.NoSuchMethodError: No virtual method

Для тех, кто столкнулся с этой проблемой в Kotlin Project.

Вы можете попробовать удалить папку .idea и снова запустить проект - для меня это решило проблему. (лучше сначала закрыть IntelliJ)

Похоже, иногда IntelliJ путается в сигнатуре основного метода и ожидает сигнатуру java вместо сигнатуры Kotlin.

Если вы используете VSCode:

Выберите: Чистое рабочее пространство

Выберите: перезагрузить и удалить

Продолжайте кодировать :-)

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

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

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

Другие вопросы по тегам