Исключения. JAVA Flashcards

1
Q

Что такое исключения?

A

Событие, которое возникает в ходе программы и прерывает стандартный ход её выполнения.

Исключение в Java – объект, экземпляр класса. Могут порождаться не только автоматически при возникновении исключительной ситуации, но и создаваться самим разработчиком.

Все классы исключений наследуются от Throwable (имеют свойство – возможность быть брошенными через слово throw).

Исключение - недвусмысленый способ сообщить о том, что вызов функции завершился неудачей.

Исключения нужны чтобы уведомить пользователя, о том, что произошла непредвиденная ситуация, на которую следует отреагировать(обработать).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Опишите иерархию исключений.

A
  1. класс Throwable (checked)
  2. от Throwable -> Error (ошибки JVM) и Exception (checked общие)
  3. от Exception
    • > RuntimeException (unchecked)
    • > IOException, SQLException, ReflectiveOperationException (checked)

4.RuntimeException (unchecked):
ClassCastException
IndexOutOfBoundException
AritthmeticException
NullPointerException

checked - зависит от программиста, unchecked - от программиста не зависит

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Какие типы исключительных ситуаций бывают в Java?

A

1) Checked Exception - проверяемое, ожидаемое исключение.
2) Runtime Exception - непроверяемое исключение, возникшее в ходе работы программы.(явные ошибки в коде)
3) Error - ошибка на уровне работы виртуальной машины.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое проверяемые исключения (Checked Exceptions)?

A

Проверяемые исключения (Checked Exceptions) можно еще назвать «ожидаемыми». Как правило, они показывают проблемы, возникающие из-за непредсказуемости внешней стороны: пользователь ввел неверные данные, файл не найден на диске и т.д.

Если метод выбрасывает проверяемое исключение, он обязан об этом объявить при помощи ключевого слова throws.

Проверяемые исключения наследуют класс Exception. Все исключения, кроме ветки RuntimeException - проверяемые.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что такое непроверяемые исключения (Runtime Exceptions)?

A

Непроверяемые исключения (Runtime Exceptions) - ошибки в приложении, возникающие во время его работы. Как правило, это результат ошибок в коде: деление на ноль, попытка запросить свойства null-объекта.

checked (контролируемые/проверяемые исключения) должны обрабатываться блоком catch или описываться в сигнатуре метода (например IOException). Наличие такого обработчика/модификатора сигнатуры проверяются на этапе компиляции;

Непроверяемые исключения не требуется декларировать с помощью throws в методе, который их выбрасывает.

Все непроверяемые исключения наследуют класс RuntimeException.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое исключения типа “ошибка” (Error)?

A

Ошибки (Error) - особые классы исключительных ситуаций, наследующие класс Error. Они связаны с ошибками, возникшими не на уровне приложения, а на уровне виртуальной машины.

Ошибка может возникнуть, например, в случае битого сектора на жестком диске или физических проблем в оперативной памяти, или недостатке памяти.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Можно ли обработать необрабатываемые исключения?

A

Можно, чтобы в некоторых случаях программа не прекратила работу

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Какой оператор позволяет принудительно выбросить исключение?

A

Это оператор throw:

throw new Exception();
Джошуа Блох пишет, что не стоит явно выбрасывать Exception, Throwable, Error, RuntimeExcseption.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

О чем говорит ключевое слово throws?

A

Модификатор throws прописывается в сигнатуре метода и указывает на то, что метод потенциально может выбросить исключение с указанным типом.

Передаёт обработку исключения вышестоящему методу.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Как создать собственное («пользовательское») исключение?

A

Необходимо унаследоваться от базового класса требуемого типа исключений (например, от Exception или RuntimeException).

и переопределить методы

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Расскажите про механизм обработки исключений в java (Try-catch-finally)

A

try — данное ключевое слово используется для отметки начала блока кода, который потенциально может привести к ошибке.

catch — ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений в случае их возникновения.

finally — ключевое слово для отметки начала блока кода, который является дополнительным. Этот блок помещается после последнего блока catch. Управление передаётся в блок finally в любом случае, было выброшено исключение или нет.

Общий вид конструкции для обработки исключительной ситуации выглядит следующим образом:

try { //код, который потенциально может привести к исключительной ситуации }

catch(SomeException e ) { //в скобках указывается класс конкретной ожидаемой ошибки

//код обработки исключительной ситуации}

finally { //необязательный блок, код которого выполняется в любом случае}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Возможно ли использование блока try-finally (без catch)?

A

try может быть в паре с finally, без catch. Работает это точно так же - после выхода из блока try выполняется блок finally

Такая запись допустима, но смысла в такой записи не так много, всё же лучше иметь блок catch, в котором будет обрабатываться необходимое исключение.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Может ли один блок catch отлавливать сразу несколько исключений?

A

В Java 7 стала доступна новая языковая конструкция т.н. multi catch, с помощью которой можно перехватывать несколько исключений одним блоком catch:

try {
//…
} catch(IOException | SQLException ex) {
//…
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Всегда ли выполняется блок finally? Существуют ли ситуации, когда блок finally не будет выполнен?

A
  • Когда System.exit(0) вызывается из блока try.
  • Когда JVM исчерпывает память catch (OutOfMemoryError oome) { // do stuff }
  • Когда присутствуют прочие критические проблемы с JVM
  • Когда ваш Java-процесс принудительно убит из задачи или консоли
  • Условие взаимоблокировки потоков в блоке try
  • Когда ваш компьютер отключается из-за сбоя питания
  • Runtime.getRuntime().exit(0), Runtime.getRuntime().halt(0) и если во время исполнения блока try виртуальная машина выполнила недопустимую операцию и будет закрыта.
  • В блоке try{} бесконечный цикл.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Может ли метод main() выбросить исключение во вне и если да, то где будет
происходить обработка данного исключения?

A

Может и оно будет передано в виртуальную машину Java (JVM).

Для случая с методом main произойдет две вещи:

  • будет завершен главный поток приложения;
  • будет вызван ThreadGroup.uncaughtException.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

В каком порядке следует обрабатывать исключения в catch блоках?

A

Общее правило: обрабатывать исключения нужно от «младшего» к старшему. Т.е. нельзя поставить в первый блок catch(Exception ex) {}, иначе все дальнейшие блоки catch() уже ничего не смогут обработать, т.к. любое исключение будет соответствовать обработчику catch(Exception ex).

17
Q

Что такое механизм try-with-resources?

A

Данная конструкция, которая появилась в Java 7, позволяет использовать блок try-catch не заботясь о закрытии ресурсов, используемых в данном сегменте кода. Ресурсы объявляются в скобках сразу после try, а компилятор уже сам неявно создает секцию finally, в которой и происходит освобождение занятых в блоке ресурсов. В качестве ресурса можно использовать любой объект, класс которого реализует интерфейс java.lang.AutoCloseable или java.io.Closeable.

Общий вид конструкции:

try(/*объявление ресурсов*/) {

  //...
} catch(Exception ex) {

  //...
} finally {

  //...
}

Стоит заметить, что блоки catch и явный finally выполняются уже после того, как закрываются ресурсы в неявном finally.

18
Q

Что произойдет если исключение будет выброшено из блока catch после чего
другое исключение будет выброшено из блока finally?

A

из файнали подавит из кэтч будет обработано в finally блоке.

Если было выброшено два исключения – одно в try, второе в finally, то исключение в finally “проглотит” исключение выше (см. пример).

Если до блока finally исключение было обработано, то мы можем получить информацию об исключении в блоке try и тем самым не потерять исключение, которое впоследствии может быть перезаписано в finally другим исключением

19
Q

Что произойдет если исключение будет выброшено из блока catch после чего другое исключение будет выброшено из метода close() при использовании try-with-resources?

A

Если исключение будет выброшено в основном коде и в методе close(), то приоритетнее будет первое исключение, а второе исключение будет подавлено, но информация о нем сохранится (с помощью метода Throwable.addSuppressed(Throwable exception), который вызывается неявно Java компилятором)

20
Q

Что такое Подавленные исключения

A

Подавленные исключения (suppressed exception) образуются, когда в блоке try генерируется исключение и в методе close() при закрытии ресурса генерируется исключение, в этом случае первое исключение считается главным остальные подавленные.
getSuppressed()){ // метод getSuppressed() вызванный на “главном” исключении показывает подавленные

21
Q

Throw early,catch late.

A

Throw early,catch late.
* Не откладывайте выбрасывание исключения, как только стала ясна причина ошибки.
* Не спешите обрабатывать исключение пока вам не стал полностью ясен механизм обработки.

22
Q

Что такое стек (stacktrace)?

A

Stacktrace - очень полезный инструмент для отладки. Это список вызовов метода, в которых приложение было посередине, когда было выбрано исключение.

Трассировка стека позволяет вам точно отслеживать, где именно в проекте возникла ошибка или исключение (exception).

Это очень полезно, потому что оно не только показывает вам, где произошла ошибка, но также и то, как программа оказалась в этом месте кода.
Точно так же, как причина, которую мы называем «стеком», состоит в том, что стек - это First in Last out (FILO), самое глубокое исключение произошло в самом начале, затем цепочка исключений была сгенерирована серией последствий, поверхность Exception была последней один случился вовремя, но мы видим это в первую очередь.

Но в большинстве случаев вы даже можете получить причину исключения из первых нескольких строк.