"ошибка: метод main не найден в классе myclass, определите метод main как ..."

<p>новые java-программисты часто сталкиваются с этими сообщениями, когда пытаются запустить java-программу.</p><hr><pre class="lang-none prettyprint-override"><code>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 </code></pre><hr><pre class="lang-none prettyprint-override"><code>error: main method is not static in class myclass, please define the main method as: public static void main(string[] args) </code></pre><hr><pre class="lang-none prettyprint-override"><code>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) </code></pre><hr><pre class="lang-none prettyprint-override"><code>java.lang.nosuchmethoderror: main exception in thread "main" </code></pre><hr><p>что это значит, что может быть причиной, и что нужно сделать, чтобы это исправить?</p>

<p>когда вы используете команду <code>java</code> для запуска приложения java из командной строки, например,</p><pre class="lang-none prettyprint-override"><code>java some.appname arg1 arg2 ... </code></pre><p>команда загружает назначенный вами класс, а затем ищет метод точки входа с именем <code>main</code>. более конкретно, он ищет метод, который объявлен следующим образом:</p><pre><code>package some; public class appname { ... public static void main(string[] args) { // body of main method follows ... } } </code></pre><p>особые требования для метода точки входа:</p><ol> <li>метод должен быть в назначенном классе.</li> <li>имя метода должно быть «основным» с <em>точно</em>, что заглавными буквами<sup>1</sup>,.</li> <li>метод должен быть <code>public</code>.</li> <li>метод должен быть <code>static</code> <sup>2</sup>,.</li> <li>тип возвращаемого значения метода должен быть <code>void</code>.</li> <li>метод должен иметь ровно один аргумент, а тип аргумента должен быть <code>string[]</code> <sup>3</sup>, </li> </ol><p>(аргумент <em>может быть</em> объявлен с использованием синтаксиса varargs; например, <code>string... args</code>. см. <a href="https://stackoverflow.com/a/36803396/139985">этот вопрос</a> для получения дополнительной информации. аргумент <code>string[]</code> используется для передачи аргументов из командной строки и требуется, даже если ваше приложение принимает без аргументов командной строки.)</p><p>если какое-либо из указанных выше требований не будет выполнено, команда <code>java</code> завершится ошибкой с некоторым вариантом сообщения:</p><pre class="lang-none prettyprint-override"><code>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 </code></pre><p>или, если вы используете <em>чрезвычайно</em> старую версию java:</p><pre class="lang-none prettyprint-override"><code>java.lang.nosuchmethoderror: main exception in thread "main" </code></pre><p>если вы столкнулись с этой ошибкой, убедитесь, что у вас есть метод <code>main</code> и он удовлетворяет всем 6 требованиям, перечисленным выше.</p><hr><p><sup>1 - один действительно неясный вариант этого случая, когда один или несколько символов в "main" - это не символ latin-1 ... но символ unicode, который <em>выглядит как</em> соответствующий символ latin-1 при отображении.</sup></p><p><sup>2 - смотрите <a href="https://stackoverflow.com/q/146576/781723">почему основной метод java статичен?</a> для объяснения того, почему метод должен быть статическим.</sup></p><p><sup>3 - <code>string</code> должен соответствовать <code>java.lang.string</code>, а не настраиваемый класс с именем <code>string</code>, скрывающий его.</sup></p>

<p>проблема в том, что у вас нет метода <code>public void main(string[] args)</code> в классе, который вы пытаетесь вызвать.</p><p>это </p><ul> <li>должен быть <code>static</code></li> <li>должен иметь ровно один аргумент массива string (который может быть назван как угодно)</li> <li>должно быть написано м-а-и-н в нижнем регистре.</li> </ul><p>обратите внимание, что вы фактически указали существующий класс (в противном случае ошибка была бы другой), но в этом классе отсутствует метод main.</p>

<p>другие ответы делают хорошую работу по обобщению требований <code>main</code>. я хочу собрать ссылки на то, где эти требования задокументированы.</p><p>наиболее авторитетным источником является спецификация <code>vm</code> (цитируется второе издание). так как <code>main</code> не является языковой функцией, она не рассматривается в спецификации языка java.</p><ul> <li> <a href="http://java.sun.com/docs/books/jvms/second\_edition/html/concepts.doc.html#29387">2.17.1 выполнение - запуск виртуальной машины</a> </li> <li> <a href="http://java.sun.com/docs/books/jvms/second\_edition/html/constantpool.doc.html#72012">5.2 запуск виртуальной машины</a> </li> </ul><p>другим хорошим ресурсом является документация для самого запуска приложений:</p><ul> <li> <a href="http://download.oracle.com/javase/6/docs/technotes/tools/windows/java.html#description">java - средство запуска приложений java</a> </li> </ul>

<p>если вы используете правильный класс, а основной определен правильно, также проверьте, есть ли у вас класс с именем string, определенный в том же пакете. это определение класса string будет рассмотрено, и, поскольку оно не подтверждено для <code>main(java.lang.string[] args)</code>, вы получите то же исключение.</p><ul> <li>это не ошибка времени компиляции, так как компилятор предполагает, что вы определяете пользовательский метод main. </li> </ul><blockquote> <p>предложение никогда не скрывать библиотечные классы java в вашем пакете.</p> </blockquote>

<p>название исключения предполагает, что программа пыталась вызвать метод, который не существует. в этом контексте кажется, что у программы нет метода <code>main</code>, хотя это поможет, если вы разместите код, вызвавший ошибку, и контекст, в котором был выполнен код.</p><p>это могло произойти, если пользователь попытался запустить файл <code>.class</code> или файл <code>.jar</code>, у которого нет метода <code>main</code> - в java метод <code>main</code> является точкой входа, чтобы начать выполнение программы.</p><p>обычно предполагается, что компилятор предотвращает это, поэтому если это действительно происходит, то это потому, что имя вызываемого метода определяется во время выполнения, а не во время компиляции.</p><p>чтобы устранить эту проблему, новый программист должен либо добавить метод промежуточного уровня (при условии, что он отсутствует <code>main</code> отсутствует) <em>или</em> изменить вызов метода на имя метода, который существует.</p><p>узнайте больше о методе main здесь: <a href="http://csis.pace.edu/~bergin/kareljava2ed/ch2/javamain.html">http://csis.pace.edu/~bergin/kareljava2ed/ch2/javamain.html</a> </p>

<p>как правило, это означает, что программа, которую вы пытаетесь запустить, не имеет "основного" метода. если вы собираетесь выполнять программу на java, выполняемый класс должен иметь метод <code>main</code></p><p>например, в файле foo.java</p><pre><code>public class foo { public static void main(args[]) { system.out.println("hello"); } } </code></pre><p>эта программа должна компилироваться и запускаться без проблем - если <code>main</code> был вызван как-то еще или не был статическим, он генерировал бы ошибку, с которой вы столкнулись.</p><p>каждая исполняемая программа, независимо от языка, нуждается в точке входа, чтобы сообщить интерпретатору, операционной системе или машине, с чего начать выполнение. в случае java это статический метод <code>main</code>, которому передается параметр <code>args[]</code>, содержащий аргументы командной строки.<br> это эквивалентно <code>int main(int argc, char** argv)</code> в c</p>

<p>я чувствую, что приведенные выше ответы пропускают сценарий, в котором эта ошибка возникает, даже если в вашем коде есть main (). когда вы используете jni, который использует <a href="http://docs.oracle.com/javase/tutorial/reflect/">reflection</a> для вызова метода. во время выполнения, если метод не найден, вы получите</p><p><code>java.lang.nosuchmethoderror: no virtual method</code></p>

<p>несколько минут назад я столкнулся с «основным методом, не определенным». теперь он решен. я попробовал все вышеперечисленное, но ничего не работало. в моем java-файле не было ошибки компиляции.</p><ul> <li>просто сделал maven update во всех зависимых проектах (alt + f5).</li> </ul><p>теперь проблема решена. получение необходимого результата.</p>