1. Общ преглед
Изключенията на Java се разделят на две основни категории: проверени изключения и непроверени изключения . В тази статия ще предоставим няколко примерни кода за това как да ги използваме.
2. Проверени изключения
По принцип проверените изключения представляват грешки извън контрола на програмата. Например конструкторът на FileInputStream изхвърля FileNotFoundException, ако входният файл не съществува.
Java проверява проверените изключения по време на компилация.
Следователно трябва да използваме ключовата дума throws, за да декларираме проверено изключение:
private static void checkedExceptionWithThrows() throws FileNotFoundException { File file = new File("not_existing_file.txt"); FileInputStream stream = new FileInputStream(file); }
Също така можем да използваме блок try-catch, за да обработим проверено изключение:
private static void checkedExceptionWithTryCatch() { File file = new File("not_existing_file.txt"); try { FileInputStream stream = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } }
Някои често срещани проверени изключения в Java са IOException , SQLException и ParseException .
Класът на изключенията е суперкласът на проверените изключения. Следователно можем да създадем персонализирано изключение, като разширим изключението :
public class IncorrectFileNameException extends Exception { public IncorrectFileNameException(String errorMessage) { super(errorMessage); } }
3. Непроверени изключения
Ако програма хвърли непроверено изключение, това отразява някаква грешка в програмната логика. Например, ако разделим число на 0, Java ще хвърли ArithmeticException :
private static void divideByZero() { int numerator = 1; int denominator = 0; int result = numerator / denominator; }
Java не проверява непроверени изключения по време на компилация. Освен това не е нужно да декларираме непроверени изключения в метод с ключовата дума throws . И въпреки че горният код няма грешки по време на компилация, той ще хвърли ArithmeticException по време на изпълнение.
Някои често срещани непроверени изключения в Java са NullPointerException , ArrayIndexOutOfBoundsException и IllegalArgumentException .
Класът RuntimeException е суперкласът на всички непроверени изключения. Следователно можем да създадем персонализирано непроверено изключение, като разширим RuntimeException :
public class NullOrEmptyException extends RuntimeException { public NullOrEmptyException(String errorMessage) { super(errorMessage); } }
4. Кога да се използват маркирани изключения и непроверени изключения
Добра практика е да се използват изключения в Java, за да можем да отделим кода за обработка на грешки от обикновения код. Трябва обаче да решим кой тип изключение да хвърлим. Документацията на Oracle Java предоставя насоки за това кога да се използват проверени изключения и непроверени изключения:
„Ако може разумно да се очаква от клиент да се възстанови от изключение, направете го отметнато изключение. Ако клиентът не може да направи нищо, за да се възстанови от изключението, направете го непроверено изключение. "
Например, преди да отворим файл, можем първо да проверим името на входния файл. Ако името на потребителския входен файл е невалидно, можем да хвърлим потребителско изключение:
if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException("Incorrect filename : " + fileName ); }
По този начин можем да възстановим системата, като приемем друго име на потребителски входен файл. Ако обаче името на входния файл е нулев указател или е празен низ, това означава, че имаме някои грешки в кода. В този случай трябва да хвърлим непроверено изключение:
if (fileName == null || fileName.isEmpty()) { throw new NullOrEmptyException("The filename is null or empty."); }
5. Заключение
В тази статия обсъдихме разликата между проверени и непроверени изключения. Предоставихме и някои примери за код, за да покажем кога да използваме отметнати или непроверени изключения.
Както винаги, всички кодове, намерени в тази статия, могат да бъдат намерени в GitHub.