2010-03-12 9 views
3

я постараюсь ответить как, пожалуйста, поправьте меня, если я ошибаюсь:Где и почему JVM проверяет, что тип возвращаемого метода ввода main (String args []) недействителен, а не что-то еще?

Где: Если статический метод вызывается с помощью Classname .method() или с помощью отражения, то это не имеет значения даже если вы измените тип возврата вызывающего метода, тот же метод все равно будет вызываться.

Так JVM, вероятно, проверяет это в одном из нативных методов jvm.cpp

methodHandle m (THREAD, init_klass->find_method(vmSymbols::object_initializer_name(),> vmSymbols::void_method_signature()));

if (m.is_null()) { ------ THROW_MSG_0 ………..

Почему: Хотя его бесполезно возвращать значение из основных, так как Java не делает ничего с это, но если мы будем пытаться изменить тип возврата основных в целом, например, JVM бросает

public static int main(String[] args) { return 1;
}

java.lang.NoSuchMethodError: main Exception in thread "main"

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

ответ

0

Что касается «почему»:

Я помню, в былые времена на Mac (OS 7 или около того), то Mac JVM будет принимать static void main() без каких-либо аргументов (потому что Mac не было командной строки) , Это уже не так.

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

+1

@Thilo В java, возвращаемое значение из main не отбрасывается, а не позволяет вернуть любое значение из main. – akjain

+0

Я все еще жду ответа на «Где». – akjain

3

Из того, что я могу собрать, причина main возвращает void в Java - это темы.

C и C++ были разработаны до того, как многопоточность была распространенной идиомой, тогда как потоки были неотъемлемой частью Java из ее концепции. В любой нетривиальной (многопоточной) программе существует более одного потока, и поэтому на самом деле ваша программа никогда не работает линейно от начала до конца основного.

Поскольку JVM не останавливает выполнение до тех пор, пока все потоки не-daemon не закончатся, возврат из основного метода не означает, что ваша программа закончилась.

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

+0

@JRL (main возвращает void, reason is threads) Можете ли вы подробнее рассказать об этом или указать мне на любую ссылку, где я могу больше узнать об этой концепции. – akjain

+0

@akjain: Я читал его в нескольких местах, включая stackoverflow и velocityreviews. Однако у меня нет авторитетных ссылок, таких как книга или стандарт. – JRL

+2

@akjain: еще один пример: шаблон рабочего стола по умолчанию в NetBeans. Весь основной метод - это новый класс GUI в потоке EDT, а затем немедленно завершается. Приложение все еще работает ... вернуло бы значение из main, а затем создало бы смысл? – JRL