«Ошибка: метод Main не найден в классе MyClass, определите метод main как ...» - PullRequest
55 голосов
/ 23 марта 2011

Новые 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"

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

Ответы [ 8 ]

37 голосов
/ 23 марта 2011

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


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

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

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

14 голосов
/ 23 марта 2011

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

Это

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

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

8 голосов
/ 23 марта 2011

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

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

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

5 голосов
/ 12 марта 2013

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

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

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

3 голосов
/ 23 марта 2011

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

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

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

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

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

1 голос
/ 23 марта 2011

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

0 голосов
/ 24 октября 2018

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

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

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

0 голосов
/ 27 февраля 2015

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

java.lang.NoSuchMethodError: No virtual method

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...