Исключения в Java делятся на два основных типа: checked (проверяемые) и unchecked. Эти типы исключений отличаются тем, как они обрабатываются компилятором и разработчиком. Давайте разберемся, в чем их различия, и приведем примеры.
Checked исключения — это исключения, которые проверяются на этапе компиляции. Это означает, что компилятор требует, чтобы такие исключения либо были обработаны с помощью блока try-catch
, либо объявлены в сигнатуре метода с помощью ключевого слова throws
. Эти исключения обычно возникают в ситуациях, которые находятся вне контроля программы, например, при работе с файлами, сетью или базами данных.
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class CheckedExceptionExample {
public static void main(String[] args) {
try {
FileInputStream file = new FileInputStream("nonexistentfile.txt");
} catch (FileNotFoundException e) {
System.out.println("Файл не найден: " + e.getMessage());
}
}
}
В этом примере FileNotFoundException
является checked исключением. Компилятор требует, чтобы это исключение было обработано, иначе программа не скомпилируется.
Unchecked исключения — это исключения, которые не проверяются на этапе компиляции. Они обычно возникают из-за ошибок в логике программы, таких как деление на ноль, обращение к элементу массива по несуществующему индексу или передача недопустимого значения в метод. Эти исключения являются подклассами RuntimeException
и не требуют обязательной обработки.
public class UncheckedExceptionExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
System.out.println(numbers[5]); // ArrayIndexOutOfBoundsException
}
}
В этом примере ArrayIndexOutOfBoundsException
является unchecked исключением. Компилятор не требует его обработки, но при выполнении программы оно вызовет ошибку.
Характеристика | Checked исключения | Unchecked исключения |
---|---|---|
Проверка на этапе компиляции | Проверяются компилятором. | Не проверяются компилятором. |
Обязательная обработка | Должны быть обработаны или объявлены. | Не требуют обязательной обработки. |
Типичные примеры | IOException , SQLException , ClassNotFoundException |
NullPointerException , ArrayIndexOutOfBoundsException , ArithmeticException |
Причина возникновения | Внешние факторы (файлы, сеть, БД). | Ошибки в логике программы. |
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class CombinedExceptionExample {
public static void main(String[] args) {
try {
readFile("nonexistentfile.txt");
} catch (FileNotFoundException e) {
System.out.println("Ошибка: " + e.getMessage());
}
try {
int result = divide(10, 0);
System.out.println("Результат: " + result);
} catch (ArithmeticException e) {
System.out.println("Ошибка: " + e.getMessage());
}
}
public static void readFile(String filename) throws FileNotFoundException {
FileInputStream file = new FileInputStream(filename);
}
public static int divide(int a, int b) {
if (b == 0) {
throw new ArithmeticException("Деление на ноль!");
}
return a / b;
}
}
В этом примере:
readFile
выбрасывает checked исключение FileNotFoundException
, которое обрабатывается в main
.divide
выбрасывает unchecked исключение ArithmeticException
, которое также обрабатывается в main
.