Ідеальний старт для майбутніх IT-розробників 👨‍💻 зі знижкою до 65%!
Дізнатися більше
26.03.2025
4 хвилин читання

Що таке throw і throws у Java?

Ключові слова throw і throws часто викликають плутанину, особливо під час співбесід. Вони стосуються винятків, але використовуються в різних контекстах. throw застосовується для створення та викидання конкретного винятку під час виконання програми, тоді як throws вказує, що метод може передавати винятки вище за стеком викликів. Ми детально розглянемо відмінності між throw і throws та розберемо деякі типові запитання на співбесідах.

Якщо ви прагнете глибше вивчити Java, варто звернутися до навчального центру FoxmindEd, який пропонує структуровані курси та кваліфікованих викладачів.

Вивчити основи Java в короткі терміни ви можете на курсі від Сергія Немчинського Java Start !
Деталі курсу

Що таке throw?

throw – це оператор у Java, який використовується для генерації винятків під час виконання програми. Завдяки throw можна свідомо викликати виняткову ситуацію, коли програма стикається з неочікуваними або некоректними вхідними даними.

public class Main {

   public static void main(String[] args) {

       AgeValidator.validateAge(20); // -> Age accepted: 20

       AgeValidator.validateAge(16); // -> IllegalArgumentException will be thrown

   }

}

class AgeValidator {

   public static void validateAge(int age) {

       if (age < 18) {

           throw new IllegalArgumentException("The age must be 18 or older!");

       }

       System.out.println("Age accepted: " + age);

   }

}

У цьому коді, якщо вік менший за 18, ми явно викидаємо IllegalArgumentException за допомогою throw. Це поширений прийом для валідації вхідних даних.

На співбесідах можуть запитати:

  • Чи можна використовувати throw без єкземпляра винятку? – Ні, потрібно передати об’єкт, який є екземпляром Throwable.
public class Main {

   public static void main(String[] args) {

       throw; // Compilation error "unexpected token"

   }

}
  • Чи можна створити виняток без new? 

Ні, оскільки виняток — це об’єкт, його потрібно явно створити через new.

  • Чи можна викинути власний клас через throw? 

Так, якщо цей клас наслідує Throwable або Exception.

  • Чи можна передавати throw рядок або число?

 Ні, можна передавати лише об’єкти, які є підкласами Throwable.

Що таке throws?

На відміну від throw, який використовується для створення та викидання винятку, throws не викликає виняток безпосередньо, а лише повідомляє, що метод потенційно може його викинути і використовується в сигнатурі методу. 

Якщо метод може спричинити перевірений виняток (Checked Exception), його потрібно або обробити всередині методу за допомогою try-catch, або задекларувати у throws, передавши обробку на рівень викликаючого коду. Ключове слово throws працює тільки з перевіреними (Checked) винятками, оскільки вони вимагають обов’язкової обробки. Неперевірені (Unchecked) винятки, такі як NullPointerException або ArithmeticException, не потребують декларації у throws, оскільки Java дозволяє викидати їх у будь-якому місці без попередження компілятора.

public class Main {

   public static void main(String[] args) {

       try {

           FileProcessor.readFile("someFile.txt");

       } catch (IOException e) {

           System.out.println("Error wile file reading: " + e.getMessage());

       }

   }

}

class FileProcessor {

   public static void readFile(String filePath) throws IOException {

       FileReader fileReader = new FileReader(filePath);

       BufferedReader bufferedReader = new BufferedReader(fileReader);

       System.out.println("File was opened: " + filePath);

       bufferedReader.close();

   }

}

Розглянемо метод readFile(), який намагається відкрити файл. Оскільки операції введення/виведення можуть спричинити IOException, ми декларуємо цей виняток за допомогою throws, щоб обробити його на рівні виклику. 

  • Чому ми не додаємо try-catch безпосередньо в метод readFile()?

Якщо метод readFile() містив би try-catch, він мав би самостійно обробляти помилки, що могло б бути неприйнятним у різних сценаріях використання. Адже різні частини програми можуть по-різному реагувати на відсутність файлу: в одному випадку може знадобитися просто викинути виняток і зупинити виконання, в іншому – спробувати відкрити резервний файл, а в третьому – повідомити користувача і запропонувати ввести інший шлях. Використовуючи throws, ми надаємо гнучкість користувачам нашого методу: вони самі вирішують, як реагувати на виняткову ситуацію, і можуть обрати найбільш відповідний спосіб її обробки. Також таким чином ми розділяємо відповідальнасть – метод readFile() відповідає лише за читання файлу, а не за обробку помилок. 

Підпишіться на наш Ютуб-канал! Корисні відео для програмістів чекають на вас! YouTube
Оберіть свій курс програмування! Шлях до кар’єри програміста починається тут! Подивитись

Якщо метод може викидати декілька винятків, вони перераховуються через кому:

public static void methodName(String someParameter) throws IOException, SQLException {

   // method logic

}

Що можуть запитати на співбесіді?

  • Чи можна використовувати throws для RuntimeException?

 Так, але це не обов’язково. Неперевірені винятки (Unchecked Exceptions), такі як NullPointerException або IllegalArgumentException, можна не декларувати у throws, оскільки компілятор цього не вимагає.

  • Чи можна перевизначити метод (override), не вказавши throws, якщо він є в батьківському класі? 

Так, але тільки якщо перевизначений метод або не викидає винятки взагалі, або викидає винятки того ж типу або їхні підкласи

  • Чи успадковують підкласи винятки, які зазначені в throws у батьківському класі?

Якщо метод батьківського класу декларує перевірений виняток (Checked Exception) у throws, то перевизначений метод у підкласі не зобов’язаний вказувати цей виняток.

Однак, якщо він все ж зазначає throws, то він може або повторити винятки батьківського методу, або вказати його підклас. Але не можна додавати нові винятки, які не присутні в батьківському методі (за винятком неперевірених RuntimeException).

class Parent {

   public void readFile() throws IOException {

       // Method logic

   }

   public void processData() throws IOException {

       // Method logic

   }

   public void connectToDatabase() throws IOException {

       // Method logic

   }

}

class Child extends Parent {

   // You can declare the same exception or its subclass.

   @Override

   public void readFile() throws FileNotFoundException {

       System.out.println("Override with FileNotFoundException");

   }

   // Exception cannot be thrown in the overridden method

   @Override

   public void processData() {

       System.out.println("Override without exception");

   }

   // Compilation error: You cannot add a new checked exception that is not in the parent method

   @Override

   public void connectToDatabase() throws SQLException {

       System.out.println("Override with SQLException");

   }

}
FAQ
Що таке throw у Java?

throw – це оператор, що використовується для явного викидання винятку під час виконання програми.

Що таке throws у Java?

throws вказує в сигнатурі методу, що він може викидати певні винятки, і передає їх обробку на вищий рівень викликів.

Чи можна використовувати throw без створення об'єкта винятку?

Ні, потрібно передавати об'єкт, який є підкласом Throwable, наприклад new IllegalArgumentException("Помилка").

Чи можна декларувати throws для RuntimeException?

Так, можна, але це не обов’язково, оскільки компілятор не вимагає декларації неперевірених (unchecked) винятків.

Чи можна перевизначити метод без throws, якщо він є у батьківському класі?

Так, якщо перевизначений метод не викидає винятки або викидає винятки того ж типу або їхні підкласи.

Чи можна додавати нові винятки у throws при перевизначенні методу?

Ні, підклас не може додавати нові перевірені (checked) винятки, які не були зазначені в батьківському методі.

Хочете дізнатися більше, що таке throw і throws у Java? Поставте своє запитання в коментарях нижче! 🤔👇

Додати коментар

Ваш імейл не буде опубліковано. Обов'язкові поля відзначені *

Зберегти моє ім'я, імейл та адресу сайту у цьому браузері для майбутніх коментарів