Перейти к основному содержимому

Проверенные и непроверенные исключения в Java

· 3 мин. чтения

1. Обзор

Исключения Java делятся на две основные категории: проверенные исключения и непроверенные исключения.

В этом руководстве мы предоставим несколько примеров кода о том, как их использовать.

2. Проверенные исключения

Как правило, проверенные исключения представляют собой ошибки, не зависящие от программы. Например, конструктор FileInputStream создает исключение FileNotFoundException , если входной файл не существует.

Java проверяет проверенные исключения во время компиляции.

Поэтому мы должны использовать ключевое слово throws для объявления проверенного исключения:

private static void checkedExceptionWithThrows() throws FileNotFoundException {
File file = new File("not_existing_file.txt");
FileInputStream stream = new FileInputStream(file);
}

Мы также можем использовать блок try-catch для обработки проверенного исключения:

private static void checkedExceptionWithTryCatch() {
File file = new File("not_existing_file.txt");
try {
FileInputStream stream = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}

Некоторыми распространенными проверенными исключениями в Java являются IOException , SQLException и ParseException .

Класс Exception является суперклассом проверенных исключений, поэтому мы можем создать пользовательское проверенное исключение , расширив Exception :

public class IncorrectFileNameException extends Exception {
public IncorrectFileNameException(String errorMessage) {
super(errorMessage);
}
}

3. Непроверенные исключения

Если программа выдает непроверенное исключение, это отражает некоторую ошибку внутри логики программы.

Например, если мы разделим число на 0, Java выдаст исключение ArithmeticException :

private static void divideByZero() {
int numerator = 1;
int denominator = 0;
int result = numerator / denominator;
}

Java не проверяет непроверенные исключения во время компиляции. Кроме того, нам не нужно объявлять непроверенные исключения в методе с ключевым словом throws . И хотя приведенный выше код не содержит ошибок во время компиляции, во время выполнения он вызовет исключение ArithmeticException .

Некоторыми распространенными непроверяемыми исключениями в Java являются NullPointerException , ArrayIndexOutOfBoundsException и IllegalArgumentException .

Класс RuntimeException является суперклассом всех непроверенных исключений, поэтому мы можем создать пользовательское непроверенное исключение , расширив RuntimeException :

public class NullOrEmptyException extends RuntimeException {
public NullOrEmptyException(String errorMessage) {
super(errorMessage);
}
}

4. Когда использовать проверенные исключения и непроверенные исключения

В Java рекомендуется использовать исключения, чтобы мы могли отделить код обработки ошибок от обычного кода. Однако нам нужно решить, какой тип исключения генерировать. Документация Oracle Java содержит рекомендации по использованию проверенных и непроверенных исключений:

«Если можно разумно ожидать, что клиент восстановится после исключения, сделайте его проверенным исключением. Если клиент не может ничего сделать для восстановления после исключения, сделайте его непроверяемым исключением».

Например, прежде чем открыть файл, мы можем сначала проверить имя входного файла. Если имя входного файла пользователя неверно, мы можем создать специальное проверенное исключение:

if (!isCorrectFileName(fileName)) {
throw new IncorrectFileNameException("Incorrect filename : " + fileName );
}

Таким образом, мы можем восстановить систему, приняв другое имя входного файла пользователя.

Однако, если имя входного файла является нулевым указателем или пустой строкой, это означает, что в коде есть ошибки. В этом случае мы должны выдать непроверенное исключение:

if (fileName == null || fileName.isEmpty())  {
throw new NullOrEmptyException("The filename is null or empty.");
}

5. Вывод

В этой статье мы обсудили разницу между проверенными и непроверенными исключениями. Мы также предоставили несколько примеров кода, чтобы показать, когда следует использовать проверенные или непроверенные исключения.

Как всегда, весь код в этой статье можно найти на GitHub .