Вопрос Java для начинающих о параметрах String [] в методе main - PullRequest
3 голосов
/ 21 мая 2010

Итак, я только что попытался исключить String[] args из метода main

Хорошо скомпилировано!

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

Почему он компилировался, когда String[] требует, чтобы он включался каждый раз?

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

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

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

Ответы [ 13 ]

6 голосов
/ 22 мая 2010

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

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

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

6 голосов
/ 21 мая 2010

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

public static void main( String[] args )

найдено. Все остальные методы с именем main являются просто "обычными" методами.

4 голосов
/ 22 мая 2010

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

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

4 голосов
/ 22 мая 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) методов (по одному на класс), преимущество в том, что вы можете использовать их для индивидуальной проверки и отладки ваших классов.

3 голосов
/ 22 мая 2010

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

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

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

2 голосов
/ 22 мая 2010

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

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

1 голос
/ 22 мая 2010

Вот цитата из Учебников по Java / Начало работы :

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

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 реализованы как массивы.

Смотри также

Смежные вопросы

1 голос
/ 22 мая 2010

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

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

1 голос
/ 22 мая 2010

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

public static void main(int foo){}

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

1 голос
/ 22 мая 2010

Вы можете иметь много методов с именем main, но только один может быть основным - точка входа в программу. Это тот, у которого есть строковые [] аргументы.

...