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"); }
Тук трябва да отбележим, че блокът final не се изпълнява, ако файлът не бъде намерен. Тъй като System.exit на блоковете за улов излиза от JVM и не позволява на най-сетне блок, за да се изпълни.
6. Избор на код за състояние
Можем да предадем всяко цяло число като код на състоянието, но общата практика е, че System.exit със статус 0 е нормален, а други са ненормални изходи.
Имайте предвид, че това е само „добра практика“ и не е строго правило, за което компилаторът да се грижи.
Също така си струва да се отбележи, когато извикаме Java програма от командния ред, че кодът на състоянието е взет под внимание.
В примера по-долу, когато се опитваме да изпълним SystemExitExample.class, ако излезе от JVM, като извика System.exit с ненулев код на състоянието, следното ехо не се отпечатва.
java SystemExitExample && echo "I will not be printed"
За да направим нашата програма способна да комуникира с други стандартни инструменти, може да помислим да следваме стандартните кодове, които съответните системи използват за комуникация.
Например UNIX кодовете на състоянието определят 128 като стандарт за „невалиден аргумент за излизане“. Така че, може би е добра идея да използваме този код, когато се нуждаем от нашия код на състоянието, за да бъде предаден на операционната система. В противен случай ние сме свободни да изберем нашия код.
7. Заключение
В този урок обсъдихме как System.exit работи кога да го използвам и как да го използвам.
Добра практика е да използвате обработка на изключения или обикновени оператори за връщане, за да излезете от програма, когато работите със сървъри за приложения и други редовни приложения. Използването на метода System.exit е по- подходящо за приложения, базирани на скриптове, или там, където кодовете на състоянието се интерпретират.
Можете да разгледате примерите, предоставени в тази статия в GitHub.