Вопрос начинающего Java по поводу аргументов String [] в основном методе

Поэтому я просто попытался исключить String[] аргументы из метода main.

Скомпилировано хорошо!

Но JVM показывает исключение

Почему он компилировался, когда String[] args ДОЛЖЕН быть включен каждый раз?

Что здесь происходит ? Почему не отображается ошибка компиляции?

напечатав это, я подумал, что, возможно, компилятор не увидел в нем метод main .. так ли?

Если это так .. почему бы и нет? Я имею в виду, что не должно быть только одного основного метода, который ДОЛЖЕН иметь String[] args в качестве аргумента?


person Serenity    schedule 21.05.2010    source источник
comment
Боковое примечание: вы также можете объявить это как: public static void main( String ... args )   -  person OscarRyz    schedule 22.05.2010
comment
Я понял ... спасибо всем ... еще не читал о перегрузке, но теперь у меня есть идея ... просто попробовал запустить программу с двумя сетями ... она работает нормально   -  person Serenity    schedule 22.05.2010
comment
Но JVM показывает исключение: какое исключение   -  person Raedwald    schedule 31.01.2018


Ответы (13)


напечатав это, я подумал, что, возможно, компилятор не видел в нем ГЛАВНЫЙ метод ... так ли?

Правильный. Ошибка компиляции отсутствует, потому что вы совершенно свободны использовать все виды методов с именем main. Но когда вы запускаете JVM и даете ей «основной класс», тогда она будет искать метод static public void main(String[]) в этом классе, и, если она не найдет такой метод, она прерывается с исключением.

Это позволяет вам иметь несколько основных методов в вашей программе, и на самом деле это единственное, что имеет смысл, если задуматься: приложения могут быть составлены из классов и файлов JAR из множества разных источников, написанных разными людьми в разное время, поэтому во многих случаях у вас не может быть с самого начала единственного назначенного «основного класса».

person Michael Borgwardt    schedule 21.05.2010

JVM ищет особый основной метод для запуска. Только подпись

public static void main( String[] args )

находится. Все остальные методы с именем main - просто «обычные» методы.

person tangens    schedule 21.05.2010
comment
Почему компилятор не обнаруживает ошибку, из-за которой main не имеет аргументов String []? - person Serenity; 22.05.2010
comment
Потому что вам не обязательно иметь main метод. Вы можете определить тот, который JVM не должен использовать для запуска программы. - person tangens; 22.05.2010
comment
Поскольку вам разрешено несколько экземпляров методов с одним и тем же именем, но с разными параметрами, это называется перегрузкой. - person Aaron; 22.05.2010

Не каждый класс должен иметь public static void main(String[] args) метод, только тот, который вы хотите запустить из JVM. В результате ваш класс будет компилироваться без ошибок, если он найдет public static void main(), но выдаст исключение, если вы попытаетесь запустить его с JVM, потому что он не может найти точку входа в программу.

В нижней строке точка входа вашей программы должна быть public static void main(String[] args), которая должна находиться по крайней мере в одном из ваших файлов .java.

Обратите внимание, что в вашем коде может быть несколько public static void main(String[] args) методов (по одному на класс). Преимущество состоит в том, что вы можете использовать их для индивидуального тестирования и отладки классов.

person Covar    schedule 21.05.2010

Чтобы попытаться ответить, «почему законна компиляция без надлежащего основного метода», это потому, что не каждый проект Java является автономным приложением, которое можно запустить. Некоторые из них представляют собой просто библиотеки, в которые другие программы будут включать их как файлы jar и использовать их код, но они не «запускаются» сами. Другие могут быть веб-приложениями, где они развертываются на уже запущенном веб-сервере, но только сам сервер имеет правильный «основной» метод. Проект веб-приложения открывается и выполняется им.

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

person Affe    schedule 21.05.2010
comment
Правильный. Другими словами, исполняемый jar-файл java в разных средах может иметь разную начальную точку, то есть апплет - ›void init (), а на серверах - более сложное соглашение. - person Jacek Cz; 24.08.2015

Java поддерживает перегрузку методов. Это означает, что у вас может быть несколько методов с одним и тем же именем, но с разными аргументами.

При этом, когда вы запускаете java ClassName, Java ищет в ClassName.class метод с подписью public static void main (String[]) (ей все равно, как называется переменная String[]) и запускает ее. Если он его не найдет, Java выйдет из строя со следующим исключением:

Исключение в потоке "main" java.lang.NoSuchMethodError: main

person Powerlord    schedule 21.05.2010

Ты прав. Среда выполнения ищет основной метод, который принимает массив строк в качестве параметра, и не находит его.

Тот факт, что у вас есть основной метод, который не принимает массив строк, не имеет значения. как и любой другой метод, вы можете создать несколько версий main(), принимающих разные параметры - среда выполнения просто проигнорирует их.

person Eric Petroelje    schedule 21.05.2010

Разве это не перегрузка? Полностью законно определять метод

static void main() {
}

Это просто не та точка входа, которую будет искать JVM.

Перегрузка - это возможность иметь несколько методов с одним и тем же именем, но разными аргументами. Фактически компилятор создает имя на основе имени метода и аргументов.

Таким образом, для компилятора будет вызываться main (String []), что-то вроде main_String_arr, а main () будет вызываться чем-то вроде main.

person extraneon    schedule 21.05.2010

У вас может быть много методов с именем main, но только один может быть ГЛАВНЫМ - точкой входа в программу. Это тот, у которого есть аргументы String [].

person Anton    schedule 21.05.2010
comment
о, понятно .. я просто попробую запустить программу с двумя сетями, тогда - person Serenity; 22.05.2010

Это все еще действующий метод. Например, у вас может быть статический метод под названием «main» с параметром int, если вы хотите:

public static void main(int foo){}

Компилятор не жалуется, потому что это верный метод! Просто для запуска программы Java Java ищет статический метод с именем «main» с одним аргументом массива String.

person Michael    schedule 21.05.2010

Да ..

Компилятор Java будет искать ту же сигнатуру метода, чтобы считать ее main

Запись любой функции с тем же именем, но с другими параметрами приведет к перегрузке функций ..
Перегруженные функции - это не одно и то же .. !!

Дело в C # как-то иначе ..

Наконец, вы должны убедиться, что ваш main такой:

 public static void main(String[] args) 
person Betamoo    schedule 21.05.2010

Вы можете использовать компилятор для компиляции части приложения: например, сделать jar-файл, который вы будете вызывать из другой части приложения; или апплет, который запускается другим способом. Поэтому компилятор не может пожаловаться на отсутствие основного метода (String []). Но пытаюсь запустить результаты такой компиляции.

Когда вы пытаетесь запустить результаты такой компиляции, java всегда ищет конкретный main (String []); если он не может его найти, он выдаст исключение во время выполнения. Основное устройство, используемое для запуска приложения, должно иметь именно эту подпись.

person DJClayworth    schedule 21.05.2010

Вот цитата из Руководства по Java / Начало работы:

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

public static void main(String[] args)

Модификаторы public и static могут быть записаны в любом порядке (public static или static public), но по соглашению используется public static, как показано выше. Вы можете назвать аргумент как угодно, но большинство программистов выбирают args или argv.

Метод main аналогичен основной функции в C и C ++; это точка входа для вашего приложения, которая впоследствии будет вызывать все другие методы, требуемые вашей программой.

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

Также обратите внимание, что с момента появления varargs вы можете фактически объявить свою точку входа в приложение следующим образом:

 public static void main(String... args)

Это работает, потому что под синтаксическим сахаром varargs в Java реализованы как массивы.

Смотрите также

Связанные вопросы

person polygenelubricants    schedule 22.05.2010

Важные точки:

  1. Ниже приводится подпись основного метода:

    public static void main(String[] args)
    
  2. основной метод может быть перегружен.

  3. Несколько классов могут содержать основной метод внутри одной единицы компиляции (и поэтому все они будут называться исполняемыми классами)

  4. Класс, содержащий основной метод, может быть или не быть открытым.

  5. По ошибке, если вы опустите ключевое слово static (или подпись каким-либо образом отличается), компиляция будет выполнена, но возникнет ошибка времени выполнения.

Из моего блога:

Java: важные моменты об основном методе

person Utsav    schedule 20.10.2014