Событие, которое встречается в ходе программы и прерывает стандартный ход её выполнения.
Исключение в JAVA – объект, экземпляр класса. Могут порождаться не только автоматически при возникновении исключительной ситуации, но и создаваться самим разработчиком. Все классы исключений наследуются от Throwable (имеют свойство – возможность быть брошенными через слово throw).
Throwable имплементируют Serializable
Исключения имеют общего предка — класс Throwable, потомками которого являются классы Exception и Error.
Error — это критическая ошибка во время исполнения программы, связанная с работой виртуальной машины Java. Error это ошибки виртуальной машины.
В большинстве случаев Error не нужно обрабатывать, поскольку она свидетельствует о каких-то серьезных недоработках в коде.
StackOverflowError — возникает, например, когда метод бесконечно вызывает сам себя;
OutOfMemoryError — возникает, когда недостаточно памяти для создания новых объектов;
NoClassDefFoundError – не смог найти класс.
Исключения (Exceptions) являются результатом проблем в программе, которые в принципе решаемые и предсказуемые.
Например, произошло деление на ноль в целых числах. RuntimeExceptions исключения, которые могут быть предотвращены программно.
Расскажите про обрабатываемые и необрабатываемые исключения?
в JAVA все исключения делятся на два типа:
Можно, но не надо.
throw new Exception();
Модификатор throws прописывается в сигнатуре метода и указывает на то, что метод потенциально может выбросить исключение с указанным типом
Необходимо наследоваться от базового класса требуемого типа исключений (например от Exception или RuntimeException).
Из finally подавит из catch будет обработано в finally блоке.
Одно в try, второе в finally, то исключение в finally проглотит исключение.
Если до блока finally исключение было обработано, то мы можем получить информацию об исключении в блоке try и тем самым не потерять исключение, которое впоследствии может быть перезаписано в finally другим исключением.
try — данное ключевое слово используется для отметки начала блока кода, который потенциально может привести к ошибке.
catch — ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений в случае их возникновения.
finally — ключевое слово для отметки начала блока кода, который является дополнительным. Этот блок помещается после последнего блока catch.
Управление передаётся в блок finally в любом случае, было выброшено исключение или нет.
Общий вид конструкции для обработки исключительной ситуации выглядит следующим образом:
try {
//код, который потенциально может привести к исключительной ситуации
} catch(SomeException e ) { //в скобках указывается класс конкретной ожидаемой ошибки
//код обработки исключительной ситуации
} finally {
//необязательный блок, код которого выполняется в любом случае
}
Да
Да
Не будет выполнен когда:
Может и оно будет передано в виртуальную машину Java (JVM).
Общее правило: обрабатывать исключения нужно от «младшего» к старшему.
Т.е. нельзя поставить в первый блок catch(Exception ex) {}, иначе все дальнейшие блоки catch() уже ничего не смогут обработать, т.к. любое исключение будет соответствовать обработчику catch(Exception ex).
Конструкцию try-with-resources ввели в JAVA 7. Она дает возможность объявлять один или несколько ресурсов в блоке try, которые будут закрыты автоматически без использования finally блока.
В качестве ресурса можно использовать любой объект, класс которого реализует интерфейс java.lang.AutoCloseable или java.io.Closable.
Если try блок также выбрасывает исключение, оно побеждает, а исключение из close() метода подавляется.
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();
}
}
}
public static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
public static String readFirstLineFromFile2(String path) throws IOException {
try (FileReader f = new FileReader("a.txt"); BufferedReader br = new BufferedReader(f)) {
return br.readLine();
}
}
Если исключение будет выброшено в основном коде (в try) и в методе close(), то приоритетнее будет
первое исключение, а второе исключение будет подавлено, но информация о нем сохранится (с
помощью метода Throwable.addSuppressed