Стаття описує 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