Статья описывает 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