Как всегда "это зависит", и вы найдете много разных мнений. Вот мой
- Исключения делятся на две основные категории.
- Вещи, которые вы можете разумно предвидеть и обрабатывать (FileNotFoundException)
- Вещи, которые вы обычно не предвидите, предполагая идеальный код (ArrayIndexOutOfBounds)
Вы, как правило, ожидаете обрабатывать первую категорию, а не последнюю. Последний обычно является ошибкой программирования.
Ваш пример относится к последнему случаю, ошибка программирования. Исключение предназначено для предоставления достоверной информации о сбое во время выполнения, а не для выполнения процесса управления.
Некоторые люди скажут, что первое - это проверенные исключения, а второе - не проверено. Я бы не согласился с этим. Я почти всегда нахожу проверенные исключения болью в реальности, так как вы почти всегда заканчиваете тем, что делаете catch / wrap / rethrow к другому типу исключения. При создании исключений и определении собственных классов исключений я почти всегда использую непроверенные.