Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

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

  1. Переменные и литералы в Java: подробное руководство
  2. Ввод и вывод в Java: печать, чтение и форматирование данных
  3. Понимание выражений, операторов и блоков в Java
  4. Классы и объекты в Java: практическое руководство
  5. Абстрактные классы и методы в Java: полное руководство
  6. Вложенные и внутренние классы в Java: типы, примеры и лучшие практики
  7. Мульти-исключения в Java: перехват нескольких исключений в одном catch блоке
  8. Освоение Java Autoboxing и Unboxing: практические примеры и лучшие практики
  9. Замена строк в Java: replace(), replaceAll() и replaceFirst() подробно
  10. Java String toLowerCase() и toUpperCase(): преобразование регистра с учётом локали