Вопрос проверяет понимание классификации исключений в Java, что необходимо для написания надежного кода, корректно обрабатывающего ошибки.
В Java исключения — это механизм обработки ошибок и нестандартных ситуаций. Ключевое различие между проверяемыми и непроверяемыми исключениями заключается в том, как компилятор Java заставляет программиста с ними работать. Это разделение влияет на дизайн API и устойчивость приложений.
Проверяемые исключения являются подклассами Exception (но не RuntimeException). Компилятор проверяет (отсюда и название), что они либо обработаны в блоке try-catch, либо объявлены в сигнатуре метода с ключевым словом throws. Это заставляет разработчика задуматься о возможных ошибках, которые могут возникнуть, и явно указать, как с ними справиться. Они обычно представляют собой внешние, непредсказуемые, но потенциально восстанавливаемые условия, такие как проблемы с вводом-выводом, отсутствие файла или сетевая ошибка.
// Пример: работа с проверяемым исключением FileNotFoundException
import java.io.*;
public class CheckedExample {
public void readFile(String path) throws FileNotFoundException {
// Компилятор требует либо обработать исключение,
// либо объявить его в throws
FileReader file = new FileReader(path);
// ... чтение файла
}
public void readFileSafely(String path) {
try {
FileReader file = new FileReader(path);
} catch (FileNotFoundException e) {
System.out.println("Файл не найден: " + e.getMessage());
}
}
}Непроверяемые исключения включают RuntimeException и его подклассы, а также Error и его подклассы. Компилятор не требует их обязательной обработки или объявления. Они часто возникают из-за логических ошибок в коде, таких как обращение к элементу массива по неверному индексу (ArrayIndexOutOfBoundsException), попытка вызова метода у null-ссылки (NullPointerException) или неверное приведение типов (ClassCastException). Ошибки (Error), например OutOfMemoryError, обычно указывают на серьезные проблемы среды выполнения, от которых программа не должна пытаться восстанавливаться.
// Пример: непроверяемые исключения возникают во время выполнения
public class UncheckedExample {
public void causeNPE() {
String str = null;
// Это вызовет NullPointerException (RuntimeException)
// Компилятор не предупредит об этом.
System.out.println(str.length());
}
public void handleUnchecked() {
try {
int result = 10 / 0; // ArithmeticException
} catch (ArithmeticException e) {
System.out.println("Деление на ноль: " + e);
}
}
}Вывод: Используйте проверяемые исключения для ошибок, от которых вы ожидаете, что вызывающий код сможет корректно восстановиться. Непроверяемые исключения подходят для ошибок, которые обычно являются следствием багов и не требуют обязательного отлова на каждом уровне вызова, что упрощает код в ситуациях, когда восстановление невозможно или нецелесообразно.