Метод повинен бути лише throws
винятком, якщо він може надати обґрунтовані гарантії стану об'єкта, будь-яких параметрів, переданих методу, та будь-яких інших об'єктів, на які діє метод. Наприклад, метод, який повинен отримати з колекції елемент, який абонент очікує міститися в ньому, може throws
мати перевірене виняток, якщо елемент, який, як очікувалося, існує в колекції, цього не робить. Абонент, який виявив цей виняток, повинен очікувати, що колекція не містить відповідного елемента.
Зауважте, що хоча Java дозволить перевіреним виняткам виділятися через метод, який оголошено як викид відповідних типів, таке використання, як правило, слід розглядати як анти-шаблон. Уявіть, наприклад, що якийсь метод LookAtSky()
оголошений як виклик FullMoonException
, і очікується, що він викине його, коли Місяць заповниться; уявіть далі, що LookAtSky()
дзвінки ExamineJupiter()
, які також оголошено як throws FullMoonException
. Якщо a FullMoonException
був кинутий ExamineJupiter()
, і якщо LookAtSky()
не впіймав його, або обробив його, або загорнув у якийсь інший тип винятку, код, який викликав LookAtSky
, припускав би, що виняток був результатом заповнення місяця Землі; він не мав би поняття, що винуватцем може бути один із супутників Юпітера.
Винятки, які може очікувати обробник абонента (включаючи, по суті, всі перевірені винятки), повинні мати змогу просочуватися через метод, лише якщо виняток означатиме те саме, що викликає метод, як це означало для викликаного методу. Якщо код викликає метод, який оголошено як викидання якогось перевіреного винятку, але той, хто викликає, не очікує, що він коли-небудь викине цей виняток на практиці (наприклад, тому що вважає, що це попередньо перевірені аргументи методу), перевірений виняток слід перехопити та обернути у якомусь неперевіреному типі винятків. Якщо абонент не очікує, що буде виключено виняток, той, хто телефонує, не може очікувати, що це матиме якесь особливе значення.