Мне нравится знать, почему только тип возврата void для основного метода в java.
public static void main(String [] args)
Почему для основного метода нет других типов возврата, отличных от void.
Спасибо
Мне нравится знать, почему только тип возврата void для основного метода в java.
public static void main(String [] args)
Почему для основного метода нет других типов возврата, отличных от void.
Спасибо
Короткий ответ: Потому что это говорит о статус выхода, который это небольшое число (обычно 8 бит). Это значение может быть возвращено из программы Java с помощью метода System.exit(int)
:
public static void exit(int status)
Завершает работу запущенной виртуальной машины Java. Аргумент служит в качестве кода состояния; по соглашению, ненулевой код состояния указывает на ненормальное завершение.
Чего вы ожидали вернуться?
В C вы обычно возвращаете код выхода int
. Однако в многопоточной системе это не имеет большого смысла. Обычно программа Java запускает несколько потоков. Основной поток часто возвращается более или менее немедленно.
System.exit
может использоваться для выхода с определенным кодом выхода.
Похоже на произвольное решение, возможно, учитывая, что не все операционные системы являются unixy в том смысле, что они позволяют программе возвращать код выхода.
Java может быть указан как C с кодом возврата int
от main
. Многопоточность не имеет значения, потому что есть только один поток, который изначально запускает главную, и его возвращаемое значение может быть тем, которое будет возвращено ОС ОС JVM, независимо от того, когда будут возвращаться другие потоки и что они делают.
Это надуманно, но если кто-то создал JVM, который может запускать несколько Java-программ, каждый со своим собственным main
, он может быть создан для возврата значения, возвращаемого последним main
для вызова.
Самое разумное обоснование заключается в том, что самому JVM может потребоваться вернуть код выхода по собственному усмотрению, однако это обоснование опровергается предоставлением System.exit(int)
, которое точно переопределяет код возврата JVM. Учитывая это, нет оснований так же разрешать main
возвращать int
тоже, как если бы последнее, что main
было System.exit(n)
В целом, звучит как произвольное решение.
Во-первых, потому что нечего возвращать значения. Основные операционные системы (например, Windows, UNIX, Linux и т.д.) Не позволяют командам "возвращать" значения. (Хотя, возможно, код выхода является возвращаемым значением, но он ограничен целым числом, и существуют различные предостережения, специфичные для ОС, например, сколько из битов может поступать из приложения.)
Во-вторых, поскольку Java не позволяет перегружать методы, которые отличаются только типом возвращаемого значения.
В-третьих, как указывает @Tom, если exit code
было возвращаемым значением main
, было бы сложно иметь дело с другими потоками, вызывающими System.exit(rc)
.
Java указывает, что точка входа приложения должна быть public static
, с именем main
, возвращает void
и принимает параметр String[]
в качестве параметра. Это так, как есть.
Тем не менее, вы можете технически определить метод main
, который не соответствует этим критериям, но они не будут действительной точкой входа приложения.
public class MainMain {
public static void main(String args[]) { // application entry point
System.out.println(main());
}
private static String main() { // just a method named main
return "Hello world!";
}
}
Вероятно, вы должны зарезервировать main
только для допустимых точек входа Java-приложений, но ничего не мешает вам писать код, как указано выше.
Поскольку вы запускаете main из JVM Hello.main
, мы не можем вернуть значение JVM. Он просто дает исключение времени выполнения.
Разумный средний путь (между наличием подписи Void, но также необходимостью вернуть значение ОС) мне представляется следующим: Чтобы исключить исключение Runtime в main для всех возвращаемых значений, соответствующих ошибке, с соответствующее сообщение в этом исключении.
Конечно, это помогает только дифференцировать ошибки и выходы без ошибок на уровне ОС (скажем, оболочку script и т.д.), но во многих случаях это на самом деле все, что необходимо, и, возможно, наиболее общее использование этих возвращаемых значений окружающей среды; либо запустить, либо не запускать следующую команду, если эта команда завершилась с ошибкой.