Возможно для кого-то это не очевидно. Однако у некоторых может возникнуть вопрос, а почему нельзя писать такой код, чтобы вообще не возникало ошибок? Ведь если вы ставите пометку (ключевое слово, предупреждение) throws, то почему бы самому вместо этого не запихать всё тело вашего метода или возможное место появления исключения в блок try-catch? Ведь вы знаете что риск есть, не от балды же появляется throws в заголовке метода! А пишется throws вместо try-catch для того, чтобы не ограничивать функционал используемого метода, а точнее его применимость в разных системах. Вот допустим вы сделали блок try-catch в своём методе, где может возникнуть исключительная ситуация. А откуда вы знаете что ваша реализация блока catch устроит того человека, кто будет использовать ваши методы? Например вы реализовали вывод в консоль сообщения об ошибке ввода и рекусивный вызов этого метода для повторного ввода. А ваш метод нужно применить в системе где нет консоли, где нужен графический интерфейс, а там будет тишина на экране, программа зависнет в рекурсивном вызове. Или вообще в этой системе нет экрана, а только печатное устройство, например кассовый аппарат, или информацию надо выводить на какой-то уникальный контроллер светодиодных панелей для наружней рекламы, вы об этом НЕ МОЖЕТЕ ЗНАТЬ! Так что если вы знаете о возможности возникновения исключения в вашем методе, который будут использовать другие люди, то не надо решать за них, что делать при возникновении исключения, оставьте им возможность реализовать ту функциональность, которая необходима им, пишите throws, а они напишут свой catch)))