Исключения Flashcards
Что такое исключения?
«Исключение» — сокращение от слов «исключительный случай». Это ситуация, в которой программа не может продолжить работу или её работа становится бессмысленной.
Исключения представляют собой объекты, которые позволяют обработать исключительную ситуацию. Исключительная ситуация— это ошибка, происходящая во время выполнения программы (так называемая ошибка времени выполнения).
Исключительные ситуации можно обрабатывать с помощью блока try/catch/finally.
- Рассмотрим, как он работает. В блок try помещается код, в котором может содержаться исключительная ситуация. Он работает либо до возникновения исключительной ситуации, либо при успешном выполнении до конца блока try.
- В блоке catch выполняются некие операции при возникновении исключительной ситуации определенного типа (в параметрах блока — в круглых скобках — указывается тип возможного исключения — т.е. класс, который обрабатывает исключительную ситуацию).
Блок catch может делать все, что угодно: вызывать необходимый класс-исключение при помощи создания его объектов с использованием ключевого слова throw (это фактически искусственная передача выполнения нужному нам блоку catch), а может и сам производить какие-либо действия.
В блоке finally выполняются определенные восстановительные операции. Он обычно предназначен для освобождения памяти, выделенной под объект. Восстановительные операции будут выполняться независимо от того, возникло исключение (теперь мы будем именно так называть исключительные ситуации) в блоке try или нет.
Блок finally может отсутствовать.
Конструкция try/catch/finally может быть вложенной.
https://skillbox.ru/media/base/isklyucheniya_v_java_chast_1/
Опишите иерархию исключений.
Исключения делятся на несколько классов, но все они имеют общего предка — класс Throwable, потомками которого являются классы Exception и Error.
Ошибки (Errors) представляют собой более серьезные проблемы, которые, согласно спецификации Java, не следует обрабатывать в собственной программе, поскольку они связаны с проблемами уровня JVM. Например, исключения такого рода возникают, если закончилась память доступная виртуальной машине.
Исключения (Exceptions) являются результатом проблем в программе, которые в принципе решаемы, предсказуемы и последствия которых возможно устранить внутри программы. Например, произошло деление целого числа на ноль.
Расскажите про обрабатываемые и необрабатываемые исключения
В Java все исключения делятся на два типа:
● checked (контролируемые/проверяемые исключения) должны обрабатываться
блоком catch или описываться в сигнатуре метода (например throws IOException). Наличие такого обработчика/модификатора сигнатуры проверяются на этапе компиляции;
● unchecked (неконтролируемые/непроверяемые исключения), к которым относятся ошибки Error (например OutOfMemoryError), обрабатывать которые не рекомендуется и исключения времени выполнения, представленные классом RuntimeException и его наследниками (например NullPointerException), которые могут не обрабатываться блоком catch и не быть описанными в сигнатуре метода.
Можно ли обработать необрабатываемые исключения?
Согласно спецификации Java, не следует пытаться обрабатывать в собственной программе.
Разработчику не предоставлены инструменты для обработки ошибок системы и виртуальной машины. Обрабатывать такие ошибки(Error) не запрещается, но делать этого не рекомендуется.
Какой оператор позволяет принудительно выбросить исключение?
Это оператор throw: throw new Exception();
О чем говорит ключевое слово throws?
Модификатор throws прописывается в сигнатуре метода и указывает на то, что метод потенциально может выбросить исключение с указанным типом.
Как создать собственное («пользовательское») исключение?
Необходимо унаследоваться от базового класса требуемого типа исключений (например от
Exception или RuntimeException).
public class ExcClass extends Exception {
private String someString;
public ExcClass (String string) { this.someString = string; System.out.println("Exception ExcClass"); }
public void myOwnExceptionMsg() { System.err.println("This is exception message for string: " + someString); } }
public class TestExc {
public static void main(String[] args) { try { String s = "SomeString"; throw new ExcClass(s); } catch (ExcClass ex) { ex.myOwnExceptionMsg(); } } } //Вывод Exception ExcClass This is exception message for string: SomeString
Расскажите про механизм обработки исключений в java (Try-catch-finally)
try — данное ключевое слово используется для отметки начала блока кода, который потенциально может привести к ошибке. catch — ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений в случае их возникновения.
finally — ключевое слово для отметки начала блока кода, который является дополнительным. Этот блок помещается после последнего блока catch. Управление передаётся в блок finally в любом случае, было выброшено исключение или нет.
Общий вид конструкции для обработки исключительной ситуации выглядит следующим образом:
try {
//код, который потенциально может привести к исключительной ситуации
}
catch(SomeException e ) { //в скобках указывается класс конкретной ожидаемой ошибки
//код обработки исключительной ситуации
}
finally {
//необязательный блок, код которого выполняется в любом случае
}
Может ли один блок catch отлавливать сразу несколько исключений?
В Java 7 стала доступна новая языковая конструкция, с помощью которой можно перехватывать
несколько исключений одним блоком catch:
try {
//…
} catch(IOException | SQLException ex) {
//…
}
Всегда ли выполняется блок finally? Существуют ли ситуации, когда блок finally не будет выполнен?
Код в блоке finally будет выполнен всегда, независимо от того, выброшено исключение или нет.
Когда JVM «умирает» - в такой ситуации finally недостижим и не будет выполнен, так как
происходит принудительный системный выход из программы.
System.exit()
Может ли метод main() выбросить исключение во вне и если да, то где будет происходить обработка данного исключения?
Может и оно будет передано в виртуальную машину Java (JVM).
В каком порядке следует обрабатывать исключения в catch блоках?
Если в блоке try возникает исключение, управление выполнением передается соответствующему блоку catch. С одним try может быть связано несколько catch, которые необходимо размещать таким образом, чтобы общий catch обработчика исключений был последним. Универсальный обработчик исключений может обрабатывать все исключения, но вы должны поместить его в конец, если вы поместите его перед перед всеми блоками перехвата, он отобразит общее сообщение.
Что такое механизм try-with-resources?
try-with-resources , также называемый автоматическим управлением ресурсами , — это новый механизм обработки исключений, представленный в Java 7, который автоматически закрывает ресурсы, используемые в блоке try catch.
Чтобы использовать этот оператор, вам просто нужно объявить необходимые ресурсы в круглых скобках, и созданный ресурс будет автоматически закрыт в конце блока.
Что произойдет если исключение будет выброшено из блока catch после чего другое исключение будет выброшено из блока finally?
Если не одна функция в стэке вызовов не способна обработать исключение, ошибка выводиться пользователю и программа завершается досрочно.
Что произойдет если исключение будет выброшено из блока catch после чего другое исключение будет выброшено из метода close() при использовании try-with-resources?
Программа завершится досрочно, произойдет утечка ресурса (не закроется соединение, не будет освобожден файловый дескриптор и т.д.)