В принципе, каждая работа заслуживает отдельного исключения. Когда вы ловите исключения, вы не различаете разные экземпляры, как вы это обычно делаете с объектами, поэтому вам нужны разные подтипы. Использование слишком большого количества пользовательских исключений - это случай, который, как я вижу, встречается редко.
Одним из советов было бы создание исключений по мере необходимости, и, если станет очевидно, что один тип исключения является дубликатом другого, проведите рефакторинг кода, объединив их. Конечно, это помогает, если некоторые мысли начинают структурировать исключения с самого начала. Но, как правило, используйте пользовательские исключения для всех случаев, которые не соответствуют 1: 1 существующим, специфичным для ситуации исключениям.
С другой стороны, NullPointerException
с и IndexOutofBoundsException
с на самом деле часто могут быть подходящими. Однако не перехватывайте их (за исключением регистрации), поскольку они являются ошибкой программирования, что означает, что после их выброса программа находится в неопределенном состоянии.