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

Новые программисты Java часто сталкиваются с сообщениями, подобными приведенным ниже, при попытке запустить программу Java. (Различные инструменты Java, IDE и т. Д. Предоставляют различные средства диагностики этой проблемы.)


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 not found in the file, please define the main method as: 
   public static void main(String[] args)

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"

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


person Community    schedule 23.03.2011    source источник
comment
Просто предполагаю, что они вызывают функцию, которой не существует, но компилятор должен остановить вас, если вы это сделаете.   -  person eternalmatt    schedule 23.03.2011
comment
@eternalmatt - это случай, с которым компилятор не может справиться. Подробности смотрите в моем ответе.   -  person Stephen C    schedule 08.10.2014


Ответы (9)


Когда вы используете команду java для запуска приложения Java из командной строки, например,

java some.AppName arg1 arg2 ...

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

package some;
public class AppName {
    ...
    public static void main(final 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 метод и что он удовлетворяет всем шести требованиям, перечисленным выше.


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

person Community    schedule 23.03.2011

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

It

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

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

person Community    schedule 23.03.2011

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

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

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

person Community    schedule 23.03.2011

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

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

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

person Community    schedule 12.03.2013

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

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

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

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

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

person Community    schedule 23.03.2011
comment
Компилятор не может с этим справиться. Он не знает, собирается ли использовать класс, который он компилирует, в качестве точки входа для программы, и, следовательно, должен ли существовать соответствующий main метод . . - person Stephen C; 08.10.2014

Как правило, это означает, что программа, которую вы пытаетесь запустить, не имеет «основного» метода. Если вы собираетесь выполнять программу на Java, выполняемый класс должен иметь main метод:

Например, в файле Foo.java

public class Foo {
    public static void main(final String args[]) {
        System.out.println("hello");
    }
}

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

Каждой исполняемой программе, независимо от языка, нужна точка входа, чтобы сообщить интерпретатору, операционной системе или машине, где начать выполнение. В случае Java это статический метод main, которому передается параметр args[], содержащий аргументы командной строки. Этот метод эквивалентен int main(int argc, char** argv) в языке C.

person Community    schedule 23.03.2011

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

java.lang.NoSuchMethodError: No virtual method

person Community    schedule 27.02.2015
comment
Это не то сообщение об ошибке, для объяснения которого предназначен вопрос. Вопрос конкретно об отсутствующем основном методе. (И, пожалуйста, не говорите мне, что это не ... потому что это я написал.) Если вы хотите рассмотреть другой сценарий, пожалуйста, не стесняйтесь открывать другой вопрос и отвечать на него самостоятельно.) - person Stephen C; 28.02.2015

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

введите описание изображения здесь

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

введите описание изображения здесь

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

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

person Community    schedule 03.06.2021
comment
Обратите внимание, что этот подход (повторная синхронизация IDE) не будет работать, если приложение не имеет правильно написанный класс точки входа. - person Stephen C; 03.06.2021

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

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

Теперь проблема решена. Получен требуемый результат.

person Community    schedule 24.10.2018
comment
Так в чем же тогда была настоящая причина? Мне кажется, это звучит так, будто вы неправильно создали приложение. Если подумать, это может быть ответом практически на все вопросы программирования, задаваемые на StackOverflow! Но мы об этом обычно не упоминаем ... - person Stephen C; 24.10.2018
comment
Я построил его с помощью maven, но в eclipse он этого не сделал. - person Raj Kumar Mishra; 25.10.2018