Основная функция ничего не возвращает. Зачем?
В отношении C/С++ main() всегда должно возвращать целое число (ноль, указывающее успех и ненулевое значение для указания отказа). Я могу понять это, поскольку программа запускается, она становится процессом, и каждый процесс должен иметь статус выхода, который мы получаем, выполняя echo $? из оболочки после завершения процесса.
Теперь я не понимаю, почему главный метод ничего не возвращает в Java? Имеет ли он какое-либо отношение к тому, что программа запущена на JVM, а процесс JVM недоступен для возврата статуса выхода?
Просьба пояснить.
Спасибо,
Роджер
Ответы
Ответ 1
Если основной метод однопоточного приложения Java завершается, приложение завершится с кодом выхода 0. Если вам нужен другой код выхода, возможно, для указания ошибки, вы можете разместить
System.exit(yourNumberHere);
в любом месте кода (особенно вне основного метода).
Это отличается для многопоточных приложений , где вам нужно использовать System.exit
изнутри kill -9
извне, чтобы остановить JVM.
Вот краткий пример, когда прекращение main не останавливает приложение (типичное поведение службы или демона):
public static void main(String args[]) {
Thread iWillSurvive = new Thread(new Runnable() {
public void run() {
while(true) {
// heat the CPU
}
}
});
iWillSurvive.start();
}
Примечание. Конечно, поток прекращается, когда он запускает метод (или основной метод в случае основного потока) завершается. И в этом случае, когда все потоки прекратятся, JVM завершится с кодом выхода 0 (что возвращает нас к исходному вопросу). Надеюсь, теперь все счастливы.
Ответ 2
Разработанный, когда многопоточность была уже распространенной, java сказал (по дизайну) "до свидания" к идее, что когда "main" возвращается, программа завершена. Вот почему нет возврата. Как говорили другие, используйте System.exit
, когда вы хотите выйти с кодом возврата.
Ответ 3
Java имеет System.exit(int)
для этой цели.
В принципе, программа Java выйдет с кодом выхода 0, если поток программы достигнет конца основного метода (грубо говоря, он становится более крутым с Swing и threading, но этого должно быть достаточно).
Если вы нажмете на System.exit()
где-нибудь (где угодно, на самом деле) или Runtime.getRuntime().exit()
, что и вызывает System.exit()
, то программа заканчивается немедленно и преждевременно.
Вы можете представить его как Java, неявно добавить System.exit(0)
в самом конце основного метода, но могут быть более тонкие различия. Тем не менее, у меня нет полной информации об отключении JVM в моей голове.
Ответ 4
Небольшой нигде - на С++ вам не нужно ничего возвращать из основного:
int main() {
}
- совершенно законная программа на C++ - она действует так, как будто у вас есть:
return 0;
как последнее утверждение в основном.
Ответ 5
значение выхода полезно для сценариев, таких как bash script или операций с командной строкой.
Поэтому в этих случаях используйте System.exit().
Ответ 6
Возможно, это может быть потому, что System.exit(int exitCode)
не вернул значение.
Ответ 7
Я подозреваю, что причина возврата C/С++ int заключается в том, что это соглашение для указания функции/метода/успеха программы/отказа на этом языке.
С введением исключений в Java вместо нуля для успеха и ненулевых значений для отказа он использует иерархию исключений для сбоев, а успехи были просто, когда не было исключено никаких исключений, что устраняет необходимость возврата значения.
Ответ 8
Большинство программ, которые я пишу в эти дни, имеют некоторую форму пользовательского интерфейса и мало того, что они могли бы с пользой вернуться, а тем более вероятность того, что что-нибудь понадобится для этого кода состояния.
Итак, зачем принудительно все программы возвращать? Как говорили другие, вы можете вернуть код состояния, если хотите...