2009-02-12 19 views
55

В случае языков с синтаксисом типа C мы объявляем метод main() возвращать значение int или float (или void). Можно ли объявить не-void возвращаемый тип из main() в Java? Если нет, то почему? Означает ли это, что программа Java не возвращает никакого значения ОС?Почему main() в java void?

+4

На каком языке 'main' возвращает значение с плавающей запятой? –

+0

Как высший проголосовавший ответ на этот вопрос указывает, есть техническая причина для этого, поэтому он не основан прежде всего на мнениях. – Raedwald

ответ

7

Вы можете вернуть int с помощью System.exit().

Возвращение чего-либо, кроме целого, не имеет особого смысла, поскольку ОС ожидает целое число. Если ничего не будет возвращено, значение по умолчанию равно 0, что означает «ОК». Другие значения обычно используются для сигнализации ошибок или особых условий.

27

This интересное обсуждение velocityreviews на ту же тему:

Highlight:

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

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

написанный

www.designacourse.com Самый простой способ приручить Любой ... Везде. Chris Smith - ведущий разработчик программного обеспечения/Технический тренер MindIQ Корпорация

66

Метод main() действительно должен иметь тип void возврата. Из Java Language Specification на "Исполнение - Virtual Machine Start-Up" (§12.1.4):

Метод main должен быть объявлен public, static и void. Он должен принять один аргумент, который является массивом строк .

Он продолжает описывать, когда программа завершается в «Исполнение - Программа выхода» (§12.8):

Программа завершает всю свою деятельность и выходы когда одна из двух вещей происходит :

  • Все нити, которые не являются Темы демона завершаются.
  • Некоторые нити вызывает exit метод класса Runtime или класса System и операции выхода не запрещено менеджером безопасности.

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

  • System.exit(int status) - Эквивалент Runtime.getRuntime().exit(status)
  • Runtime.exit(int status) - Заканчивает в настоящее время работает JVM путем запуска его последовательности выключения (запустите все зарегистрированные shutdown hooks и uninvoked finalizers, если необходимо). Как только это будет сделано, JVM остановится.
  • Runtime.halt(int status) - принудительно завершает работу JVM в настоящее время.

Из трех, System.exit() является обычным и наиболее удобным способом для завершения JVM.

22

Причина, по которой метод main имеет void в качестве возвращаемого типа, заключается в том, что один раз main заканчивается, это не обязательно означает, что вся программа завершена. Если main порождает новые потоки, то эти потоки могут поддерживать работу программы. Тип возврата main на данный момент не имеет смысла.

Например, это очень распространено в приложениях Swing, где метод main обычно запускает графический интерфейс в потоке Swing, а затем main заканчивается ... но программа все еще работает.

+0

Питер, не могли бы вы уточнить для себя (в настоящее время изучают многопоточность java) ... Это ТОЛЬКО ДЕАНОМ, которые НЕ ДОЛЖНЫ пережить main()? – Max

+5

@Max: no, main() метод не имеет контроля над JVM. Когда JVM запускается, он будет запускать метод main(), но когда main() заканчивается, это не означает, что JVM terminaes. JVM продолжает выполнять все потоки, пока 1) Runtime.exit() не будет вызван OR 2) все нормальные (не демона) потоки скончались. Нитки демона не учитывают это второе условие. Другими словами ... если метод main() порождает некоторые нормальные потоки, JVM будет ** не ** завершаться, когда main() заканчивается. Если main() не создает нити, JVM завершится.Если main() порождает только потоки демона, JVM также прекращается, когда main() заканчивается. –

+0

Пит, спасибо за кладовку. – Max

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