Подтвердить что ты не робот

Java System.exit(0); vs С++ return 0;

Когда мы изучаем С++ в школе, наш профессор скажет нам написать return 0; в последней строке кодов в основной функции, и это считается хорошей практикой программирования.

В Java я понимаю, что некоторые люди пишут System.exit(0); в последней строке основного метода.

Тем не менее, в С++, если я использую exit(0);, меня штрафует мой профессор, потому что (в школе) для процедурного программирования мы ожидаем, что программа пойдет до конца основного и позволит программе остановиться естественным образом.

Мой вопрос: Является ли Java System.exit(0); похожим на С++ return 0;? (Или это похоже на С++ exit(0))

Неправильная практика использовать System.exit(0) в java, когда она не нужна (I.e.: запись ее в последнюю строку основного метода)?

4b9b3361

Ответ 1

Java System.exit(0) похож на С++ exit(0) тем, что

  • Он завершает процесс
  • Он может быть вызван из в любом месте в программе.

Последний момент делает его "неструктурированной" конструкцией потока управления, которая, как правило, хмурится академическими типами. (В этом случае у них есть веская причина: если функция сообщает об ошибке через исключение (или старомодный код возврата), то возможно, что вызывающий абонент восстановится после ошибки, но exit сжег этот мост. Конечно, иногда ошибки должны рассматриваться как фатальные.)

В С++ return 0 эквивалентен exit(0) , если он находится в main функции. (В других функциях это не означает ничего особенного.)

Соответствующий различие между С++ и Java здесь - это возвращаемый тип main.

  • В С++ main должен возвращать int. Обычно это означает, что он должен иметь оператор return, но стандарт С++ делает main особый случай с подразумеваемым return 0; в качестве конца, если вы его не пишете.
  • В Java main должен возвращать void.

В С++ обычно писать инструкции return в main, даже если это технически избыточно, для стилистической согласованности со всеми другими функциями не void в вашей программе.

В Java вы не можете return получить код выхода из main, потому что это функция void. Итак, если вы хотите явно указать код выхода, вы должны использовать System.exit.

Неверно завершать каждую функцию Java main с помощью System.exit(0), но это просто не идиоматично, если у вас нет такой конструкции, как

public static void main(String[] args) {
   try {
       //... do the work
       System.exit(0);
   } catch (Throwable t) {
       //... report the error
       System.exit(1);
   }
}

Ответ 2

В Java System.exit(0) System.exit(1) System.exit(-1) используется, чтобы узнать, было ли выполнение программы хорошим или плохим. 0 используется, когда исполнение прекратилось. 1, -1, whatever != 0 При возникновении некоторой ошибки вы можете использовать разные значения для разных типов ошибок.

Вы также можете сказать следующее:

0 означает все в порядке

1 означает, что что-то, что я ожидаю пойти не так, ошибочно

-1 означает что-то, чего я не ожидал, не получилось.

Java Doc говорит:

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


Является Java System.exit(0); аналогично С++ return 0;

Да, они оба похожи.

Неправильно ли использовать System.exit(0) в java, когда это ненужный

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

Пример для этого:

try {  
    runTheWholeApplication();  
    System.exit(0);  // Signifying the normal end of your program
} catch (Throwable t) {  
    reportErrorSomehow(t);  
    System.exit(1);  // Signifying that there is an error
}

Ответ 3

Когда мы изучаем С++ в школе, наш профессор скажет нам написать return 0; в последней строке кодов в основной функции, и это считается хорошей практикой программирования.

Это спорно. Он также сказал вам, что return 0; подразумевается внутри main? Лично я никогда не пишу избыточную return 0; внутри main, и я почти никогда не вижу ее в коде других людей.

Ответ 4

Да. Java System.exit(0); является прямым аналогом, потому что прототипный метод Java main определяется как

public static void main(String[] args) {
}

Поэтому он буквально не может return a int (хотя он может просто return;). В С++ вы могли бы exit(0);, что также эквивалентно.

Ответ 5

Исходная операционная система Unix в значительной степени полагалась на сценарии командной строки, используя и объединяя множество небольших программ. Для потока управления использовался код возврата программы. Код возврата 0 означает все в порядке, отличное от нуля для ошибок.

Таким образом, C int main(...) является прямым отображением, а return 0; в конце соответствует. Выход там как бросание исключения, минуя любое возвращение. Он также отключает вызов основного из другой программы.

В Java public void main(...) это было упрощено, а 0 неявно. System.exit(0); имеет такое же плохое предположение, что никакая другая программа не вызывает main. Хотя в целом void отражается на 99% использовании, теперь System.exit(...); неизбежно для ненулевого кода ошибки.

Это также следует рассматривать как более общее дизайнерское решение; C в значительной степени полагается на коды возврата функций, что затрудняет процесс управления или подверженность ошибкам, поскольку Java вводит использование исключений в качестве возможного обязательного потока управления со свободно выбираемым уловом. В настоящее время альтернативой System.exit(13) может быть throw new IllegalArgumentException("Unlucky");.