Вопрос навеян вот этим вопросом. Там мне все советуют преобразовать проверяемое исключение в непроверяемое.
А вопрос у меня такой: зачем разработчики Java придумали такой термин как проверяемое исключение? Какой от этого профит? Чтобы знать какой метод может выбросить исключение, а какой нет? Так любой метод может выкинуть какой-нибудь NullPointerException который все равно нужно ловить и обрабатывать? Так чем NullPointerException отличается от IOException который нужно обязательно декларировать в throws? Ни в одном, известном мне, языке, такого термина нет.
Единственное объяснение, которое я могу придумать это то, что при возникновении проверяемого исключения, объект находится в некотором предусмотренном состоянии, и при непроверяемом - объект может быть поврежден.
NullPointerException никогда не произойдет, если вы будете делать проверку на null. IOException - такое исключение может воникнуть, даже если вы постараетесь заранее определить, возникнет ли оно. По сути, это для программиста как "чистый код". Он делает более удобно и красиво архитектуру кода.
Т.е. если, к примеру, вы видите, что ошибку можно не проверять, делаете ее рантайм. Как-то так, я думаю.
Вопрос о проверяемых и непроверяемых исключениях довольно спорный и часто возникающий, особенно когда появляется куча новых API, которым они мешают нормально развернуться (те же стримы и лямбды, например). Поэтому рассуждать о правильности их ввода спустя больше чем 20 лет после появления языка уже не совсем правильно.
NPE непроверяемое просто потому, что может теоретически возникнуть в любой строчке. Деление на ноль потенциально охватывает все случаи деления целых чисел, а OutOfMemoryError может вылететь во время создания любого объекта. Аналогичные причины можно найти и для остальных исключений.
Продвижение своими сайтами как стратегия роста и независимости