JavaRush/Java блог/Архив info.javarush/Топ 10 вопросов об исключениях в Java
raynn
31 уровень

Топ 10 вопросов об исключениях в Java

Статья из группы Архив info.javarush
участников
Статья описывает 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();
}
Игнорировать легче всего. Но даже если так часто поступают, не значит, что это корректно. Ссылки:
  1. Непроверяемые исключения в Java
  2. Корень иерархического дерева исключений в Java
  3. Вопросы об исключениях на сайте stackoverflow
Оригинал статьи
Что еще почитать:

Исключения в Java

Комментарии (13)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
VladimirAhlan
Уровень 20
15 марта 2021, 19:27
Люблю ответы на вопросы типа 4-го: -да не парься, it just works, так сделали разрабы и поэтому это аксиома
Гречанов костя
Уровень 3
30 июля 2019, 17:46
Подскажите пожалуйста где можно глянуть пример кода Exeption c Response code Massage!
Dmitriy
Уровень 22
8 мая 2019, 06:00
я не могу понять, почему например анчекед исключение арифметик экзкпшен я могу обработать. в чём отличие чекед и анчекед?
3 июля 2019, 16:40
анчекед исключения ты сможешь увидеть только в рантайме. чекед можно обработать сразу так тебе на них указывает среда разработки, имею в виду идею или еклипсу
Kalter
Уровень 0
27 июля 2014, 21:09
Было бы ещё неплохо написать что-нибудь про try-with-resources, появившейся в седьмой JDK.
И ещё такой вопрос: как подбросить RuntimeException?
А в целом за статью спасибо)
raynn
Уровень 31
28 июля 2014, 17:49
Да как и любое другое исключение:
throw new ArrayIndexOutOfBoundsException();

или можно хоть самого родителя бросить, только смысл теряется:
throw new RuntimeException();
volko
Уровень 32
18 июля 2014, 09:27
Спасибо за труд.
Подскажите кто-нибудь, можно ли зацикливать try-catch?
Например как считывать имя файла с клавиатуры до тех пор, пока пользователь не введет его безошибочно или не «сдастся».
raynn
Уровень 31
18 июля 2014, 10:23
Конечно, можно.
Кроме того, нпример, IntelliJ IDEA даже не даст скомпилировать такой код, если reader.readLine() не обернуть в try-catch или не пробросить исключение в описании метода
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
for (;;)
{
    String s = reader.readLine();
    if (s.equals("")) break;
}
hubert
Уровень 41
18 июля 2014, 10:34
А кто вас так учит циклы писать бесконечные?)
Зачем while, do циклы?
raynn
Уровень 31
18 июля 2014, 11:48
ну, как же :))
4. Знакомство с ветвлениями и циклами
1    for (; true; )
2    {
3        String s = buffer.readLine();
4        if (s.equals("exit"))
5        break;   
6    }
Денис Белеуц
Уровень 18
17 марта 2019, 17:23
Встречал в книгах "Философия JAVA"
Dmitriy
Уровень 22
8 мая 2019, 06:04
а что плохого в for(;;)? читаемо, удобно, быстро. до сих пор не встречал ни одного цикла, который нельзя было написать через фор, но при этом можно вайлом и ду.
Artem
Уровень 22
17 июля 2014, 04:40
Спасибо за статью!