1. Обзор
В этом руководстве мы рассмотрим, что означает System.exit
в Java.
Мы увидим его цели, где его использовать и как его использовать. Мы также увидим, в чем разница при вызове с разными кодами состояния.
2. Что такое System.exit
?
System.exit
— пустой
метод. Он принимает код выхода, который передает вызывающему сценарию или программе.
Выход с нулевым кодом означает нормальный выход:
System.exit(0);
Мы можем передать любое целое число в качестве аргумента метода. Код состояния, отличный от нуля, рассматривается как аварийный выход.
Вызов метода System.exit
завершает работающую в данный момент JVM и закрывает программу. Этот метод не возвращает нормально.
Это означает, что последующий за System.exit
код фактически недоступен , и тем не менее компилятор не знает об этом.
System.exit(0);
System.out.println("This line is unreachable");
Не рекомендуется закрывать программу с помощью System.exit(0)
. Это дает нам тот же результат выхода из основного
метода, а также останавливает выполнение последующих строк, а также поток, вызывающий System.exit
, блокируется до тех пор, пока JVM не завершит работу. Если перехватчик выключения отправляет задачу в этот поток, это приводит к взаимоблокировке.
3. Зачем нам это нужно?
Типичный пример использования System.exit
— когда возникает ненормальное состояние, и нам нужно немедленно выйти из программы.
Кроме того, если нам нужно завершить программу из места, отличного от основного метода, System.exit
является одним из способов достижения этого.
4. Когда нам это нужно?
Обычно сценарий полагается на коды выхода команд, которые он вызывает. Если такая команда является Java-приложением, System.exit
удобен для отправки этого кода выхода.
Например, вместо создания исключения мы можем вернуть ненормальный код выхода, который затем может быть интерпретирован вызывающим скриптом.
Или мы можем использовать System.exit
для вызова любых зарегистрированных перехватчиков выключения. Эти ловушки можно настроить для очистки удерживаемых ресурсов и безопасного выхода из других потоков , не являющихся демонами.
5. Простой пример
В этом примере мы пытаемся прочитать файл и, если он существует, выводим из него строку. Если файл не существует, мы выходим из программы с помощью System.exit
из блока catch.
try {
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
System.out.println(br.readLine());
br.close();
} catch (IOException e) {
System.exit(2);
} finally {
System.out.println("Exiting the program");
}
Здесь мы должны отметить, что блок finally не выполняется, если файл не найден. Поскольку System.exit
в блоках catch выходит из JVM и не позволяет выполниться блоку finally .
6. Выбор кода состояния
Мы можем передать любое целое число в качестве кода состояния, но общая практика такова, что System.exit
с кодом состояния 0 является нормальным, а другие — ненормальными выходами.
Обратите внимание, что это всего лишь «хорошая практика», а не строгое правило, о котором заботится компилятор.
Кроме того, стоит отметить, что при вызове Java-программы из командной строки учитывается код состояния.
В приведенном ниже примере, когда мы пытаемся выполнить SystemExitExample.class,
если он выходит из JVM, вызывая System.exit
с ненулевым кодом состояния, следующее эхо не печатается.
java SystemExitExample && echo "I will not be printed"
Чтобы наша программа могла взаимодействовать с другими стандартными инструментами, мы могли бы рассмотреть возможность использования стандартных кодов, которые используют связанные системы для связи.
В документе « Коды выхода со специальными значениями », подготовленном проектом документации Linux, представлен список зарезервированных кодов. Он также советует, какие коды использовать для конкретных сценариев.
7. Заключение
В этом руководстве мы обсудили, как работает System.exit
, когда его использовать и как его использовать.
Хорошей практикой является использование обработки исключений или простых операторов возврата для выхода из программы при работе с серверами приложений и другими обычными приложениями. Использование метода System.exit
лучше подходит для приложений на основе скриптов или везде, где интерпретируются коды состояния.
Вы можете ознакомиться с примерами, приведенными в этой статье , на GitHub .