Исключения Java. Перехват исключений в Java.
Исключения бывают в жизни у каждого. Каждый из нас сталкивается с ситуациями, когда ошибся и приходится выкручиваться.
Но что, если в программировании можно заранее предотвращать эти неприятные ситуации?! Да-да, можно! Для этого и было в введено понятие Исключений, Ошибок (от англ. - Exception).
Другими словами, в языке программирования Java описаны все возможные варианты исключений, которые может выкинуть Ваша программа! Так как Java - это объектно-ориентированный язык программирования, то каждый Exception это Класс. И эти Классы унаследуют друг друга, раcширяя их возможности и делая их более уникальными для каждого вида ошибок.
А расширяют они друг друга следующим образом:
Как и в жизни, есть ошибки(CHECKED), которые мы можем предотвратить и заранее приготовили для них решение. Например: если Вы едите в путешествие, скорее всего, Вы берете с собой аптечку, чтобы если кому-то станет плохо, у Вас было лекарство под рукой.
А бывают непредвиденные ошибки(UNCHECKED). Например: Вы поехали в жаркую страну и неожиданно циклон пригнал холода и начал падать снег летом.
Так и в языке программирования Java есть:
- CHECKED Ошибки - те, для которых мы обязательно должны прописать какое-то решение, если что-то пойдет не так.
- UNCHECKED Ошибки - те, которые мы не можем предвидеть заранее.
А на логичный вопрос: "А как заранее подготовить решение для ошибки?" Уже заготовлен заранее ответ. Вот так:
Блок try catch - помогает обработать определенный участок кода таким образом, что когда выскочит ошибка, она не приведет к завершению программы, а просто выполнит блок catch.
- В блоке try Вы пишите код, который может в какой-то момент сработать не правильно и создать ошибку.
- В блоке catch Вы ловите эту ошибку, указав какой класс Ошибки будете ловить, после чего описываете как ее обработаете.
Давайте рассмотрим это на примере.
Например: если Вы захотите записать в файл текст, для этого можно использовать класс FileWriter. (Примечание: Если Вы не знакомы с FileWriter, прочитайте вот эту статью).
1 2 3 4 5 6 |
public class Test { public static void main(String[] args) { FileWriter fileWriter = new FileWriter("out.txt"); fileWriter.write("Hello World"); } } |
Как выглядит в среде разработки:
Другими словами, этот Класс подчеркивается красным и среда разрабтки предлагает записать тот же участок кода только в блоке try catch. Попробуем:
Например:
1 2 3 4 5 6 7 8 9 10 11 |
public class Test { public static void main(String[] args) { try { FileWriter fileWriter = new FileWriter("out.txt"); fileWriter.write("Hello World"); fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } |
В таком случае ошибок не возникает и код отрабатывает успешно:
Так же в блоке catch можно обрабатывать ошибки абсолютно разным образом.
К примеру, если Вы сначала закроете файл, а после попробуете записать в него данные, выскочит Ошибка.
Например:
1 2 3 4 5 6 7 8 9 10 11 |
public class Test { public static void main(String[] args) { try { FileWriter fileWriter = new FileWriter("out.txt"); fileWriter.close(); fileWriter.write("Hello World"); } catch (IOException e) { e.printStackTrace(); } } } |
Вывод в консоль:
В блоке catch, написано выводить ошибку в консоль. Было упомянуто, что выполняется любой код распаложеный в блоке catch. Давайте попробуем:
Например:
1 2 3 4 5 6 7 8 9 10 11 |
public class Test { public static void main(String[] args) { try { FileWriter fileWriter = new FileWriter("out.txt"); fileWriter.close(); fileWriter.write("Hello World"); } catch (IOException e) { System.out.println("Ошибка - Нельзя записать в закрытый файл!"); } } } |
Вывод в консоль:
Выполнился только тот код, который написан в блоке catch.
Даже при ошибке программа продолжает успешно работать!
Например:
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Test { public static void main(String[] args) { try { FileWriter fileWriter = new FileWriter("out.txt"); fileWriter.close(); fileWriter.write("Hello World"); } catch (IOException e) { System.out.println("Ошибка - Нельзя записать в закрытый файл!"); } System.out.println("Программа работает успешно!"); } } |
Вывод в консоль:
Другими словами программа продолжит выполняться, даже когда выкинулась ошибка. А все потому, что Вы ее правильно обработали.
Но так же существует блок "finally", который будет выполняться всегда:
- если была вызвана ошибка и выполнился блок catch
- если все исполнилось без ошибок.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Test { public static void main(String[] args) { try { FileWriter fileWriter = new FileWriter("out.txt"); fileWriter.write("Hello World"); fileWriter.close(); } catch (IOException e) { System.out.println("Ошибка - Нельзя записать в закрытый файл!"); }finally { System.out.println("Выполняюсь всегда!"); } System.out.println("Программа работает успешно!"); } } |
Вывод в консоль:
И даже так!
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Test { public static void main(String[] args) { try { FileWriter fileWriter = new FileWriter("out.txt"); fileWriter.close(); fileWriter.write("Hello World"); } catch (IOException e) { System.out.println("Ошибка - Нельзя записать в закрытый файл!"); }finally { System.out.println("Выполняюсь всегда!"); } System.out.println("Программа работает успешно!"); } } |
Вывод в консоль:
В Checked Ошибках можно обойтись и без блока "try catch", подключив Класс ошибки напрямую к методу зарезервированным словом "throws":
Например:
1 2 3 4 5 6 7 8 9 10 |
public class Test { public static void main(String[] args) throws IOException { FileWriter fileWriter = new FileWriter("out.txt"); fileWriter.close(); fileWriter.write("Hello World"); System.out.println("Программа работает успешно!"); } } |
Вывод в консоль:
В результате в момент когда выскочила ошибка, исполнение программы остановилось. Но таким образом можно избавиться от блоков "try catch". Если Вы точно уверенны, что код написан правильно.
В таком случае, если поменять местами закрытие и запись в файл - выйдет следующее:
Например:
1 2 3 4 5 6 7 8 9 10 |
public class Test { public static void main(String[] args) throws IOException { FileWriter fileWriter = new FileWriter("out.txt"); fileWriter.write("Hello World"); fileWriter.close(); System.out.println("Программа работает успешно!"); } } |
Вывод в консоль:
В UNCHECKED Ошибках все гораздо проще. Так же можно использовать блок "try catch", если Вы явно видите, что может произойти ошибка.
Например:
1 2 3 4 5 6 7 |
public class Test { public static void main(String[] args) { int a = 5; int b = 0; int c = a/b; } } |
Вывод в консоль:
Так как делить на ноль нельзя, в таком случае выскакивает ошибка Класса ArithmeticException. Но если Вы знаете заранее, что может такое произойти при выполнении программы, тогда конечно, чтобы не остановилось выполнение программы можно использовать блок "try catch".
Например:
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Test { public static void main(String[] args){ int a = 5; int b = 0; try { int c = a/b; }catch (ArithmeticException e){ System.out.println("Делить на нуль - нельзя!"); } System.out.println("Программа работает успешно!"); } } |
Вывод в консоль: