Где и почему JVM проверяет, что возвращаемый тип метода ввода main (String args []) не имеет значения, а не что-нибудь еще? - PullRequest
3 голосов
/ 12 марта 2010

Я постараюсь ответить на оба вопроса, пожалуйста, поправьте меня, если я ошибаюсь:

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

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

methodHandle m (РЕЗЬБА, init_klass-> find_method (vmSymbols :: object_initializer_name (),> vmSymbols :: void_method_signature () ));

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

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

public static int main (String [] args) { возврат 1;
}

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

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

Ответы [ 2 ]

3 голосов
/ 12 марта 2010

Насколько я могу понять, причина main возврата void в Java - потоки.

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

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

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

0 голосов
/ 12 марта 2010

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

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

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

...