Основная функция ничего не возвращает. Зачем?

В отношении 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

Большинство программ, которые я пишу в эти дни, имеют некоторую форму пользовательского интерфейса и мало того, что они могли бы с пользой вернуться, а тем более вероятность того, что что-нибудь понадобится для этого кода состояния.

Итак, зачем принудительно все программы возвращать? Как говорили другие, вы можете вернуть код состояния, если хотите...