возвращаемый тип main в java - PullRequest
19 голосов
/ 14 марта 2010

Мне хотелось бы знать, почему в java используется только возвращаемый тип void для метода main.

public static void main(String [] args)

Почему для метода main нет других типов возврата, кроме void.

Спасибо

Ответы [ 7 ]

28 голосов
/ 14 марта 2010

Краткий ответ: потому что это то, что сказано в спецификации языка .

В современных широко используемых операционных системах (семейства Windows и Unix) единственным «возвращаемым значением» процесса является состояние выхода , которое представляет собой небольшое число (обычно 8-битное) Это значение можно вернуть из Java-программы, используя метод System.exit(int):

public static void exit(int status)

Завершает работающую в данный момент виртуальную машину Java. Аргумент служит кодом состояния; условно, ненулевой код состояния указывает на ненормальное завершение.

25 голосов
/ 14 марта 2010

Что вы ожидали вернуть?

В C вы обычно возвращаете int код выхода. Однако в многопоточной системе это не имеет особого смысла. Обычно Java-программа запускает несколько потоков. Основной поток часто возвращается более или менее немедленно.

System.exit может использоваться для выхода с определенным кодом выхода.

2 голосов
/ 14 сентября 2013

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

Java можно было указать как C с кодом возврата int из main. Многопоточность не имеет значения, потому что только один поток первоначально запускает main, и его возвращаемое значение может быть тем, которое JVM возвращает ОС в ОС, независимо от того, когда другие потоки возвращаются и что они делают.

Это надумано, но если кто-то создал JVM, которая может запускать несколько Java-программ, каждая из которых имеет свой собственный main, он может быть рассчитан на возвращение значения, возвращаемого последним main, который будет вызван.

Наиболее разумное обоснование заключается в том, что самой JVM может потребоваться возвращать код выхода по собственным причинам, однако это обоснование противоречит положению System.exit(int), которое в точности переопределяет код возврата JVM. Учитывая это, нет никаких оснований для того, чтобы аналогичным образом разрешать main возвращать int также, как если бы последнее, что main сделало, было System.exit(n)

В целом звучит как произвольное решение.

1 голос
/ 14 марта 2010

Во-первых, потому что нечего возвращать значения. Основные операционные системы (например, Windows, UNIX, Linux и т. Д.) Не позволяют командам «возвращать» значения. (Хотя, возможно, код выхода является возвращаемым значением, но он ограничен целым числом, и существуют различные предупреждения для конкретной ОС; например, относительно того, сколько битов может поступить из приложения.)

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

В-третьих, как указывает @Tom, если бы exit code было возвращаемым значением main, было бы трудно иметь дело с другими потоками, вызывающими System.exit(rc).

0 голосов
/ 24 декабря 2014

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

Конечно, это помогает различать только выходы с ошибками и без ошибок на уровне ОС (скажем, сценарий оболочки и т. Д.), Но во многих случаях это фактически все, что нужно, и, вероятно, наиболее распространенное использование из этих сред возвращаемые значения; либо запустите, либо не запускайте следующую команду, если эта команда не выполнена.

0 голосов
/ 14 сентября 2013

Поскольку вы запускаете main из JVM Hello.main, мы не можем вернуть значение в JVM. Это просто дает исключение времени выполнения.

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

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, но ничто не мешает вам написать код, подобный приведенному выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...