Вопрос-ответ

"Error: Main method not found in class MyClass, please define the main method as..."

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

Начинающие 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"

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

Переведено автоматически
Ответ 1

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

Ответ 2

The problem is that you do not have a public void main(String[] args) method in the class you attempt to invoke.

It


  • must be static

  • must have exactly one String array argument (which may be named anything)

  • must be spelled m-a-i-n in lowercase.

Note, that you HAVE actually specified an existing class (otherwise the error would have been different), but that class lacks the main method.

Ответ 3

Other answers are doing a good job of summarizing the requirements of main. I want to gather references to where those requirements are documented.

The most authoritative source is the VM spec (second edition cited). As main is not a language feature, it is not considered in the Java Language Specification.

Another good resource is the documentation for the application launcher itself:

Ответ 4

If you are running the correct class and the main is properly defined, also check if you have a class called String defined in the same package. This definition of String class will be considered and since it doesn't confirm to main(java.lang.String[] args), you will get the same exception.


  • It's not a compile time error since compiler just assumes you are defining a custom main method.


Suggestion is to never hide library java classes in your package.


java