234
правки
Изменения
→Обработка исключений
Чтобы сгенерировать исключение используется ключевое слово <code>throw</code>. Как и любой объект в Java, исключения создаются с помощью <code>new</code>.
}
Как и было сказано раньше, определение метода должно содержать список всех проверяемых исключений, которые метод может бросить. Также можно написать более общий класс, среди наследников которого есть эти исключения.
===try-catch-finally===
Код, который может бросить исключения оборачивается в <code>try</code>-блок, после которого идут блоки <code>catch</code> и <code>finally</code>.
// Код, который может сгенерировать исключение
}
Сразу после блока проверки следуют после обработчики исключений, которые объявляются ключевым словом <code>catch</code>.
// Код, который может сгенерировать исключение
} '''catch'''('''Type1''' id1) {
// Обработка исключения Type1
} '''catch'''('''Type2''' id2) {
// Обработка исключения Type2
}
Сatch-блоки обрабатывают исключения, указанные в качестве аргумента. Тип аргумента должен быть классом, унаследованного от <code>Throwable</code>, или самим <code>Throwable</code>. Блок <code>catch </code> выполняется, если тип брошенного исключения является наследником типа аргумента и если это исключение не было обработано предыдущими блоками.
Код из блока <code>finally </code> выполнится в любом случае: при нормальном выходе из <code>try</code>, после обработки исключения или при выходе по команде <code>return</code>.
'''NB:''' Если JVM выйдет во время выполнения кода из <code>try </code> или <code>catch</code>, то <code>finally </code> блок может не выполниться. Также, например, если поток выполняющий <code>try </code> или <code>catch </code> код остановлен, то блок <code>finally </code> может не выполниться, даже если приложение продолжает работать.
Блок <code>finally </code> удобен для закрытия файлов и освобождения любых других ресурсов. Код в блоке <code>finally </code> должен быть максимально простым. Если внутри блока <code>finally </code> будет брошено какое-либо исключение или просто встретится оператор <code>return</code>, брошенное в блоке <code>try </code> исключение (если таковое было брошено) будет забыто.
<tt>import</tt> java.io.IOException;
}
После того, как было брошено первое исключение - <code>new Exception("a") </code> - будет выполнен блок <code>finally</code>, в котором будет брошено исключение <code>new IOException("b")</code>, именно оно будет поймано и обработано. Результатом его выполнения будет вывод в консоль ''<code>b''</code>. Исходное исключение теряется.
===Информация об исключениях===
* <code>getMessage()</code>. Этот метод возвращает строку, которая была первым параметром при создании исключения;* <code>getCause() </code> возвращает исключение, которое стало причиной текущего исключения;* <code>printStackTrace() </code> печатает stack trace, который содержит информацию, с помощью которой можно определить причину исключения и место, где оно было брошено.
Exception in thread "main" java.lang.IllegalStateException: A book has a null property
at com.example.myproject.Author.getBookIds(Author.java:35)
Все методы выводятся в обратном порядке вызовов. В примере исключение <code>IllegalStateException </code> было брошено в методе <code>getBookIds</code>, который был вызван в <code>main</code>. "Caused by" означает, что исключение <code>NullPointerException </code> является причиной <code>IllegalStateException</code>.
==Разработка исключений==