Исключение означает, что что-то пошло не так в «текущем методе». Теперь разработчик может обработать его в блоке catch текущего метода или просто сказать вызывающему методу, что что-то пошло не так, как надо.
Таким образом, в конечном итоге разработчик может перевести ошибку обратно в операционную систему. Итак, все дело в том, чтобы сбросить ошибку обратно в вызывающий метод или не возвращать ее в какой-то момент.
В этом случае есть два места, где вы, как разработчик, можете решить, будет ли сообщение об исключении каскадно возвращаться в ОС или нет, во-первых, это метод, который вы написали. Как я вижу, вы писали, что исключение будет выдано, теперь в методе main у вас, как у разработчика, снова есть шанс не выбросить его в ОС (включив в него try-catch, но не добавив блок catch), или throw это к ОС.
В вашем примере вы решили выбросить его обратно в ОС, добавив предложение throws.
С точки зрения Java, Java хочет, чтобы вы (разработчик) принимали осознанное решение по любому заданному (проверенному) исключению, и поэтому вы будете видеть ошибки компиляции, пока вы либо не подавите исключение, не добавив, либо пока вы на самом деле сбросьте его обратно в ОС из метода 'main'.