Статья описывает 10 наиболее часто задаваемых вопросов об исключениях в Java.
![Топ 10 вопросов об исключениях в Java - 1]()
1. Проверяемые и непроверяемые
В кратце, проверяемые исключения должны быть явно пойманы в теле метода или объявлены в секции throws метода. Непроверяемые исключения вызваны проблемами, которые не могут быть решены, такими как деление на 0, нулевой указатель и т.п. Проверяемые исключения особенно важны потому, что от других разработчиков, использующих ваше API, вы ожидаете, что они будут знать, как обращаться с исключениями.
Например, IOException - часто используемое проверяемое исключение, а RuntimeException - непроверяемое. Перед тем, как читать дальше, ознакомьтесь с
Иерархической диаграммой исключений в Java.
2. Лучший способ работать с исключениями
Если исключение может быть правильно обработано, его надо ловить, иначе, оно должно быть проброшено дальше.
3. Почему переменные, определенные в try не могут быть использованы в catch или finally?
В следующем куске кода строку s, объявленную в блоке try, нельзя использовать в блоке catch. Этот код не скомпилируется.
try {
File file = new File("path");
FileInputStream fis = new FileInputStream(file);
String s = "inside";
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println(s);
}
Причина в том, что неизвестно, где именно в блоке try могло быть вызвано исключение. Вполне возможно, что исключение было вызвано до того, как был объявлен объект. И именно для данного примера это справедливо.
4. Почему Double.parseDouble(null) и Integer.parseInt(null) вызывают разные исключения?
Так и есть, они действительно вызывают разные исключения. Это проблема JDK. Они просто были разработаны разными людьми, и не стоит всерьёз заморачиваться над этим.
Integer.parseInt(null);
// вызывает java.lang.NumberFormatException: null
Double.parseDouble(null);
// вызывает java.lang.NullPointerException
5. Основные runtime exceptions в Java
Вот несколько из них:
IllegalArgumentException
ArrayIndexOutOfBoundsException
Их можно использовать в операторе if, когда условие не выполняется, как здесь:
if (obj == null) {
throw new IllegalArgumentException("obj не может быть равно null");
6. Можно ли поймать несколько исключений в одном блоке catch?
Ответ - ДА. Пока классы этих исключений можно отследить вверх по иерархии наследования классов до одного и того же суперкласса, можно использовать только этот суперкласс.
7. Может ли конструктор вызывать исключения?
Ответ - ДА. Конструктор - это просто особый вид метода.
Вот пример кода.
8. Вызов исключений в блоке final
В принципе, можно вполне законно сделать так:
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
FileInputStream fis = new FileInputStream(file2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
Но чтобы сохранить читабельность кода, надо объявить вложенный блок
try-catch
как новый метод, и вставить вызов этого метода в блок
finally
.
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
methodThrowException();
}
}
9. Можно ли использовать return в блоке finally
Да, можно.
10. Почему разработчики обрабатывают исключения втихую?
Часто встречаются например такие куски кода. Если правильная обработка исключений так важна, почему разработчики продолжают так писать?
try {
...
} catch(Exception e) {
e.printStackTrace();
}
Игнорировать легче всего. Но даже если так часто поступают, не значит, что это корректно.
Ссылки:
- Непроверяемые исключения в Java
- Корень иерархического дерева исключений в Java
- Вопросы об исключениях на сайте stackoverflow
Оригинал статьи
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
И ещё такой вопрос: как подбросить RuntimeException?
А в целом за статью спасибо)
или можно хоть самого родителя бросить, только смысл теряется:
Подскажите кто-нибудь, можно ли зацикливать try-catch?
Например как считывать имя файла с клавиатуры до тех пор, пока пользователь не введет его безошибочно или не «сдастся».
Кроме того, нпример, IntelliJ IDEA даже не даст скомпилировать такой код, если reader.readLine() не обернуть в try-catch или не пробросить исключение в описании метода
Зачем while, do циклы?
4. Знакомство с ветвлениями и циклами