Исключения JAVA

Вопросы к собеседованию

Вопросы:

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

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

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

Throwable имплементирует Serializable

Иерархия исключений

Схема исключений

Исключения имеют общего предка — класс Throwable, потомками которого являются классы Exception и Error.

Error — это критическая ошибка во время исполнения программы, связанная с работой виртуальной машины Java. Error это ошибки виртуальной машины.

В большинстве случаев Error не нужно обрабатывать, поскольку она свидетельствует о каких-то серьезных недоработках в коде.

StackOverflowError — возникает, например, когда метод бесконечно вызывает сам себя;

OutOfMemoryError — возникает, когда недостаточно памяти для создания новых объектов;

NoClassDefFoundError – не смог найти класс.

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

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

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

В Java все исключения делятся на два типа:

RuntimeExceptions:

Обработка исключений


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

Можно, но не надо.


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

throw new Exception();


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

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


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

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


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

Из finally подавит из catch будет обработано в finally блоке.

Одно в try, второе в finally, то исключение в finally проглотит исключение.

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

Механизм Try-catch-finally

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

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

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

Управление передаётся в блок finally в любом случае, было выброшено исключение или нет.

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

try {

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

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

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

} finally {

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

}


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

Да


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

Да


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

Не будет выполнен когда:

  1. Когда System.exit(0) вызывается из блока try.
  2. Когда JVM исчерпывает память catch (OutOfMemoryError oome) { // do stuff }
  3. Когда ваш java-процесс принудительно убит из задачи или консоли
  4. Условие взаимоблокировки потоков в блоке try
  5. Когда ваш компьютер отключается из-за сбоя питания

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

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


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


Общее правило: обрабатывать исключения нужно от «младшего» к старшему.

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

Механизм Try-With-Resources

Конструкцию try-with-resources ввели в Java 7. Она дает возможность объявлять один или несколько ресурсов в блоке try, которые будут закрыты автоматически без использования finally блока.

В качестве ресурса можно использовать любой объект, класс которого реализует интерфейс java.lang.AutoCloseable или java.io.Closable.

Если try блок также выбрасывает исключение, оно побеждает, а исключение из close() метода подавляется.

Использование блока finally для закрытия ресурса

public static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {

BufferedReader br = new BufferedReader(new FileReader(path));

try {

return br.readLine();

} finally {

if (br != null) {

br.close();

}

}

}

Использование конструкции try-with-resources для закрытия ресурса

public static String readFirstLineFromFile(String path) throws IOException {

try (BufferedReader br = new BufferedReader(new FileReader(path))) {

return br.readLine();

}

}

Использование конструкции try-with-resources для закрытия нескольких ресурсов

public static String readFirstLineFromFile2(String path) throws IOException {

try (FileReader f = new FileReader("a.txt"); BufferedReader br = new BufferedReader(f)) {

return br.readLine();

}

}


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

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