Java throw vs throws: мастерство обработки исключений с практическими примерами
Java throw vs throws: мастерство обработки исключений
Это руководство объясняет, как использовать ключевые слова Java throw и throws для эффективной обработки исключений, проиллюстрированных реальными примерами кода.
В Java исключения делятся на две категории:
- Unchecked Exceptions — не проверяются во время компиляции, а во время выполнения. Примеры:
ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsExceptionи все подклассыError. - Checked Exceptions — принудительно проверяются компилятором. Примеры:
IOException,InterruptedExceptionи многие другие.
Для глубокого погружения см. Java Exceptions.
Unchecked исключения обычно сигнализируют об ошибках программирования; их следует исправлять, а не перехватывать. Checked исключения, с другой стороны, представляют условия, о которых вызывающие должны знать и обрабатывать.
Использование ключевого слова throws
Клауза throws объявляет, что метод может выбросить одно или несколько исключений, делегируя ответственность вызывающим. Ее синтаксис:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2 { /* код */ }
Вы можете перечислить несколько типов исключений, разделенных запятыми.
Пример 1: Объявление checked исключения
import java.io.*; class Main { public static void findFile() throws IOException { // Код, который может вызвать IOException File newFile = new File("test.txt"); FileInputStream stream = new FileInputStream(newFile); } public static void main(String[] args) { try { findFile(); } catch (IOException e) { System.out.println(e); } } }
Вывод:
java.io.FileNotFoundException: test.txt (No such file or directory)
Если test.txt отсутствует, FileInputStream выбрасывает FileNotFoundException, подкласс IOException. Поскольку findFile() объявляет throws IOException, метод main() должен обработать или распространить исключение.
Выбрасывание нескольких исключений
Вы можете объявить несколько типов исключений в одном клаузе throws:
import java.io.*; class Main { public static void findFile() throws NullPointerException, IOException, InvalidClassException { // Потенциально выбрасывает NullPointerException … // Потенциально выбрасывает IOException … // Потенциально выбрасывает InvalidClassException … } public static void main(String[] args) { try { findFile(); } catch (IOException e1) { System.out.println(e1.getMessage()); } catch (InvalidClassException e2) { System.out.println(e2.getMessage()); } } }
Обратите внимание, что NullPointerException — unchecked, поэтому его не нужно перехватывать или объявлять вызывающим.
Когда использовать throws вместо try...catch
Встраивание try...catch в каждый метод, который может выбросить исключение, может загромождать код и запутывать логику. Объявление throws сохраняет подпись метода чистой и позволяет коду более высокого уровня решать, как обрабатывать ошибки.
Использование ключевого слова throw
Оператор throw явно выбрасывает экземпляр исключения, передавая управление ближайшему соответствующему блоку catch или завершая программу, если не обработано.
Синтаксис:
throw throwableObject;
Здесь throwableObject — экземпляр Throwable или одного из его подклассов.
Пример 2: Выбрасывание unchecked исключения
class Main { public static void divideByZero() { throw new ArithmeticException("Trying to divide by 0"); } public static void main(String[] args) { divideByZero(); } }
Вывод:
Exception in thread "main" java.lang.ArithmeticException: Trying to divide by 0 at Main.divideByZero(Main.java:3) at Main.main(Main.java:7) exit status 1
Поскольку ArithmeticException — unchecked, его перехват опционален.
Пример 3: Выбрасывание checked исключения
import java.io.*; class Main { public static void findFile() throws IOException { throw new IOException("File not found"); } public static void main(String[] args) { try { findFile(); System.out.println("Rest of code in try block"); } catch (IOException e) { System.out.println(e.getMessage()); } } }
Вывод:
File not found
Здесь findFile() выбрасывает checked IOException, поэтому вызывающие должны либо обрабатывать, либо объявлять его. Метод main() демонстрирует перехват исключения, предотвращая аварийное завершение программы.
java
- Переменные и литералы в Java: подробное руководство
- Ввод и вывод в Java: печать, чтение и форматирование данных
- Понимание выражений, операторов и блоков в Java
- Классы и объекты в Java: практическое руководство
- Абстрактные классы и методы в Java: полное руководство
- Вложенные и внутренние классы в Java: типы, примеры и лучшие практики
- Мульти-исключения в Java: перехват нескольких исключений в одном catch блоке
- Освоение Java Autoboxing и Unboxing: практические примеры и лучшие практики
- Замена строк в Java: replace(), replaceAll() и replaceFirst() подробно
- Java String toLowerCase() и toUpperCase(): преобразование регистра с учётом локали