Исключения. JAVA Flashcards
Что такое исключения?
Событие, которое возникает в ходе программы и прерывает стандартный ход её выполнения.
Исключение в Java – объект, экземпляр класса. Могут порождаться не только автоматически при возникновении исключительной ситуации, но и создаваться самим разработчиком.
Все классы исключений наследуются от Throwable (имеют свойство – возможность быть брошенными через слово throw).
Исключение - недвусмысленый способ сообщить о том, что вызов функции завершился неудачей.
Исключения нужны чтобы уведомить пользователя, о том, что произошла непредвиденная ситуация, на которую следует отреагировать(обработать).
Опишите иерархию исключений.
- класс Throwable (checked)
- от Throwable -> Error (ошибки JVM) и Exception (checked общие)
- от Exception
- > RuntimeException (unchecked)
- > IOException, SQLException, ReflectiveOperationException (checked)
4.RuntimeException (unchecked):
ClassCastException
IndexOutOfBoundException
AritthmeticException
NullPointerException
checked - зависит от программиста, unchecked - от программиста не зависит
Какие типы исключительных ситуаций бывают в Java?
1) Checked Exception - проверяемое, ожидаемое исключение.
2) Runtime Exception - непроверяемое исключение, возникшее в ходе работы программы.(явные ошибки в коде)
3) Error - ошибка на уровне работы виртуальной машины.
Что такое проверяемые исключения (Checked Exceptions)?
Проверяемые исключения (Checked Exceptions) можно еще назвать «ожидаемыми». Как правило, они показывают проблемы, возникающие из-за непредсказуемости внешней стороны: пользователь ввел неверные данные, файл не найден на диске и т.д.
Если метод выбрасывает проверяемое исключение, он обязан об этом объявить при помощи ключевого слова throws.
Проверяемые исключения наследуют класс Exception. Все исключения, кроме ветки RuntimeException - проверяемые.
Что такое непроверяемые исключения (Runtime Exceptions)?
Непроверяемые исключения (Runtime Exceptions) - ошибки в приложении, возникающие во время его работы. Как правило, это результат ошибок в коде: деление на ноль, попытка запросить свойства null-объекта.
checked (контролируемые/проверяемые исключения) должны обрабатываться блоком catch или описываться в сигнатуре метода (например IOException). Наличие такого обработчика/модификатора сигнатуры проверяются на этапе компиляции;
Непроверяемые исключения не требуется декларировать с помощью throws в методе, который их выбрасывает.
Все непроверяемые исключения наследуют класс RuntimeException.
Что такое исключения типа “ошибка” (Error)?
Ошибки (Error) - особые классы исключительных ситуаций, наследующие класс Error. Они связаны с ошибками, возникшими не на уровне приложения, а на уровне виртуальной машины.
Ошибка может возникнуть, например, в случае битого сектора на жестком диске или физических проблем в оперативной памяти, или недостатке памяти.
Можно ли обработать необрабатываемые исключения?
Можно, чтобы в некоторых случаях программа не прекратила работу
Какой оператор позволяет принудительно выбросить исключение?
Это оператор throw:
throw new Exception();
Джошуа Блох пишет, что не стоит явно выбрасывать Exception, Throwable, Error, RuntimeExcseption.
О чем говорит ключевое слово throws?
Модификатор throws прописывается в сигнатуре метода и указывает на то, что метод потенциально может выбросить исключение с указанным типом.
Передаёт обработку исключения вышестоящему методу.
Как создать собственное («пользовательское») исключение?
Необходимо унаследоваться от базового класса требуемого типа исключений (например, от Exception или RuntimeException).
и переопределить методы
Расскажите про механизм обработки исключений в java (Try-catch-finally)
try — данное ключевое слово используется для отметки начала блока кода, который потенциально может привести к ошибке.
catch — ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений в случае их возникновения.
finally — ключевое слово для отметки начала блока кода, который является дополнительным. Этот блок помещается после последнего блока catch. Управление передаётся в блок finally в любом случае, было выброшено исключение или нет.
Общий вид конструкции для обработки исключительной ситуации выглядит следующим образом:
try { //код, который потенциально может привести к исключительной ситуации }
catch(SomeException e ) { //в скобках указывается класс конкретной ожидаемой ошибки
//код обработки исключительной ситуации}
finally { //необязательный блок, код которого выполняется в любом случае}
Возможно ли использование блока try-finally (без catch)?
try может быть в паре с finally, без catch. Работает это точно так же - после выхода из блока try выполняется блок finally
Такая запись допустима, но смысла в такой записи не так много, всё же лучше иметь блок catch, в котором будет обрабатываться необходимое исключение.
Может ли один блок catch отлавливать сразу несколько исключений?
В Java 7 стала доступна новая языковая конструкция т.н. multi catch, с помощью которой можно перехватывать несколько исключений одним блоком catch:
try {
//…
} catch(IOException | SQLException ex) {
//…
}
Всегда ли выполняется блок finally? Существуют ли ситуации, когда блок finally не будет выполнен?
- Когда System.exit(0) вызывается из блока try.
- Когда JVM исчерпывает память catch (OutOfMemoryError oome) { // do stuff }
- Когда присутствуют прочие критические проблемы с JVM
- Когда ваш Java-процесс принудительно убит из задачи или консоли
- Условие взаимоблокировки потоков в блоке try
- Когда ваш компьютер отключается из-за сбоя питания
- Runtime.getRuntime().exit(0), Runtime.getRuntime().halt(0) и если во время исполнения блока try виртуальная машина выполнила недопустимую операцию и будет закрыта.
- В блоке try{} бесконечный цикл.
Может ли метод main() выбросить исключение во вне и если да, то где будет
происходить обработка данного исключения?
Может и оно будет передано в виртуальную машину Java (JVM).
Для случая с методом main произойдет две вещи:
- будет завершен главный поток приложения;
- будет вызван ThreadGroup.uncaughtException.
В каком порядке следует обрабатывать исключения в catch блоках?
Общее правило: обрабатывать исключения нужно от «младшего» к старшему. Т.е. нельзя поставить в первый блок catch(Exception ex) {}, иначе все дальнейшие блоки catch() уже ничего не смогут обработать, т.к. любое исключение будет соответствовать обработчику catch(Exception ex).
Что такое механизм try-with-resources?
Данная конструкция, которая появилась в Java 7, позволяет использовать блок try-catch не заботясь о закрытии ресурсов, используемых в данном сегменте кода. Ресурсы объявляются в скобках сразу после try, а компилятор уже сам неявно создает секцию finally, в которой и происходит освобождение занятых в блоке ресурсов. В качестве ресурса можно использовать любой объект, класс которого реализует интерфейс java.lang.AutoCloseable или java.io.Closeable.
Общий вид конструкции:
try(/*объявление ресурсов*/) { //... } catch(Exception ex) { //... } finally { //... }
Стоит заметить, что блоки catch и явный finally выполняются уже после того, как закрываются ресурсы в неявном finally.
Что произойдет если исключение будет выброшено из блока catch после чего
другое исключение будет выброшено из блока finally?
из файнали подавит из кэтч будет обработано в finally блоке.
Если было выброшено два исключения – одно в try, второе в finally, то исключение в finally “проглотит” исключение выше (см. пример).
Если до блока finally исключение было обработано, то мы можем получить информацию об исключении в блоке try и тем самым не потерять исключение, которое впоследствии может быть перезаписано в finally другим исключением
Что произойдет если исключение будет выброшено из блока catch после чего другое исключение будет выброшено из метода close() при использовании try-with-resources?
Если исключение будет выброшено в основном коде и в методе close(), то приоритетнее будет первое исключение, а второе исключение будет подавлено, но информация о нем сохранится (с помощью метода Throwable.addSuppressed(Throwable exception), который вызывается неявно Java компилятором)
Что такое Подавленные исключения
Подавленные исключения (suppressed exception) образуются, когда в блоке try генерируется исключение и в методе close() при закрытии ресурса генерируется исключение, в этом случае первое исключение считается главным остальные подавленные.
getSuppressed()){ // метод getSuppressed() вызванный на “главном” исключении показывает подавленные
Throw early,catch late.
Throw early,catch late.
* Не откладывайте выбрасывание исключения, как только стала ясна причина ошибки.
* Не спешите обрабатывать исключение пока вам не стал полностью ясен механизм обработки.
Что такое стек (stacktrace)?
Stacktrace - очень полезный инструмент для отладки. Это список вызовов метода, в которых приложение было посередине, когда было выбрано исключение.
Трассировка стека позволяет вам точно отслеживать, где именно в проекте возникла ошибка или исключение (exception).
Это очень полезно, потому что оно не только показывает вам, где произошла ошибка, но также и то, как программа оказалась в этом месте кода.
Точно так же, как причина, которую мы называем «стеком», состоит в том, что стек - это First in Last out (FILO), самое глубокое исключение произошло в самом начале, затем цепочка исключений была сгенерирована серией последствий, поверхность Exception была последней один случился вовремя, но мы видим это в первую очередь.
Но в большинстве случаев вы даже можете получить причину исключения из первых нескольких строк.