Условно исключения можно разделить на три типа:
контролируемые;
некотролируемые;
фатальные.
Контролируемые исключения могут происходить при нормальном выполнении системы и в большинстве своем характеризуют такие ситуации, как ошибки соединения с внешним сервисом, неверный пользовательский ввод и т.д.
Некотролируемые исключения – это исключения, которые возникают вследствие выполнения некорректного кода. Эти исключения, как правило, могут быть перехвачены, но исправлению подлежат лишь в единичных случаях. К таким исключениям относят исключения возникающие при обращении по нулевому указателю, вызове несуществующего или защищенного метода, в результате неверного приведения типов и т.д.
Фатальные исключения описывают ошибки, большую часть которых приложение не должно перехватывать. К ним относятся такие ситуации, как нехватка памяти, переполнение стека, попытка оперирования уже уничтоженным потоком приложения, внутренняя ошибка виртуальной машины или интерпретатора и многие другие.
В языке Java различие между этими типами исключений достаточно явно. Контролируемые исключения описываются в прототипе метода и компилятор проверяет, может ли данное исключение быть сгенерировано внутри метода.
void openDoor(Key key) throws InvalidKeyException...
Некотролируемые исключения являются наследниками класса RuntimeException. Такие исключения могут быть сгенерированы самой виртуальной машиной, даже если их класс не объявлен в прототипе метода.