Pull to refresh

System.exit(). Какой код выхода использовать?

Reading time2 min
Views61K
Что является причиной того, что java программа прекращает любую свою активность и завершает свое выполнение? Основных причин может быть 2 (JLS Секция 12.8):

  • Все потоки, которые не являются демонами, выполнены;
  • Какой то из потоков вызывает метод exit() класса Runtime или же класса System и
    SecurityManager дает добро на выполнение exit().

В обоих случаях в процессе завершения работы JVM передает своему родительскому процессу (процессу который запустил JVM) код выхода — значение типа int, на основании которого родительский процесс может делать выводы об успешности или не удачности выполнения поставленных перед JVM задач.

Исходя из общепринятой практики и установленных стандартов код выхода равный 0 — сигнализирует об успешном выполнении задачи.

public class Example1 {

	public static void main(String args[]) {
		System.out.println("Example 1");
	}
}

Именно значение 0 и возвращает JVM в первом, вышеописанном случае при своем завершении.

Как это можно проверить?
Тут нам на помощь приходит параметр командной строки ERRORLEVEL, который позволяет получить код выхода программы, которую мы запускали последней.
image
Как видим со скриншота код выхода равен 0.

Переходим ко второму случаю, с использованием метода exit().

Какие значения можно передавать в метод exit? Исходя из документации:
The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination.

Ага, варианта два: либо 0, либо любое ненулевое значение. Второй вариант можем разбить еще на два под варианта: любое отрицательное число и любое положительное число типа int.

Итак, пробуем вариант с 0:

public class Example2 {

	public static void main(String args[]) {
		System.out.println("Example 2 - Start");
		System.exit(0);
		System.out.println("Example 2 - End");
	}
}
image
Как видим, родительский процесс снова получил информацию об успешном завершении JVM.

А что же с nonzero значениями? Что, когда и в каком случае передавать?
Тут все просто — никаких требований для nonzero значений нету и следует руководствоваться лишь одним общим правилом:

  1. Возвращаем код выхода со значением >0 в случае, если мы ожидали что что то может случится нехорошее и оно таки случилось, например: некорректные данные в args[], или не удалось найти какой то важный для работы приложения файл, или не удалось подключиться к серверу и тд.
  2. Возвращаем код выхода со значением <0, в случае, когда произошло что то, чего мы даже не могли спрогнозировать и совсем не ожидали (какие то системные ошибки).

Так же мы можем руководствоваться и следующим подходом — возвращать такое значение кода выхода, которое мы сами пожелаем. Такой вариант можно использовать, если мы знаем, что никакой родительский процесс (в нашем случае cmd) не делает никакой дополнительной обработки кода выхода, в таком случае мы вольны вернуть любое значение какое нам вздумается, это абсолютно ни на что не повлияет.

И последний вариант: если нам известно, что код выхода дополнительно обрабатывается и дабы не выдумывать значения самому можно позаимствовать значения, которые используются на уровни ОС.
Например, для ОС семейства Windows существует целый список из 15999 кодов: System Error Codes, для семейства Linux свой список: sysexits.h
Tags:
Hubs:
-18
Comments6

Articles