User raynn
raynn
31 уровень
Нижний Новгород

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

Статья из группы Архив info.javarush.ru
Статья описывает 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
Люблю ответы на вопросы типа 4-го: -да не парься, it just works, так сделали разрабы и поэтому это аксиома
Гречанов костя Уровень 3, Днепр
30 июля 2019
Подскажите пожалуйста где можно глянуть пример кода Exeption c Response code Massage!
Dmitriy Уровень 22, Москва, Россия
8 мая 2019
я не могу понять, почему например анчекед исключение арифметик экзкпшен я могу обработать. в чём отличие чекед и анчекед?
Kalter Уровень 0, Оренбург
27 июля 2014
Было бы ещё неплохо написать что-нибудь про try-with-resources, появившейся в седьмой JDK.
И ещё такой вопрос: как подбросить RuntimeException?
А в целом за статью спасибо)
volko Уровень 32, Донецк, Украина
18 июля 2014
Спасибо за труд.
Подскажите кто-нибудь, можно ли зацикливать try-catch?
Например как считывать имя файла с клавиатуры до тех пор, пока пользователь не введет его безошибочно или не «сдастся».
Artem Уровень 22, Румыния
17 июля 2014
Спасибо за статью!