"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; publicclassAppName { ... publicstaticvoidmain(final String[] args) { // body of main method follows ... } }
Конкретные требования к методу точки входа следующие:
Метод должен быть в указанном классе.
Имя метода должно быть "main" с точно такой заглавной буквы, как 1.
Метод должен быть public.
Метод должен быть static2.
Тип возвращаемого значения метода должен быть void.
Метод должен иметь ровно один аргумент, а тип аргумента должен быть 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.
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.