Я думаю, что ваша предпосылка о том, что непроверенные исключения никогда не обрабатываются, неверна. Конечно, вы никогда не должны обрабатывать NullPointerException
, IndexOutOfBoundsException
и т. Д., Поскольку они указывают на логические ошибки в программировании, и поэтому их отлов фактически скрывает факт наличия ошибки в программе. Однако некоторые API имеют иерархии исключений, которые имеют корни в RuntimeException
, и, если это так, то вы можете в конечном итоге поймать целую кучу таких в вашем приложении; на самом деле, я ранее разработал приложение с графическим интерфейсом, в котором нужно было обработать огромное количество различных исключений, унаследованных от RuntimeException
, и этот API, как оказалось, использовался больше, чем любой из API в языке Java, который генерирует проверенные исключения, и в этом случае на самом деле все было наоборот.
Тем не менее, если есть что-то, что абсолютно необходимо обработать, по соглашению, они превращаются в проверенные исключения (наследуются от Exception
вместо RuntimeException
). Кроме того, компилятор заставляет вас обрабатывать такое исключение или объявлять, что оно выбрасывается (это означает «проверенное исключение»). Таким образом, сочетание соглашения и требования, вероятно, является причиной того, что вы, возможно, обрабатываете больше проверенных, чем непроверенных исключений (потому что те, которые являются срочными, были преобразованы в проверенные исключения по соглашению, или вы игнорируете важные непроверенные исключения, потому что вы не вынуждены справиться с ними).