IMO, проверенные исключения являются ошибочной реализацией того, что могло бы быть довольно приличной идеей (при совершенно других обстоятельствах - но на самом деле даже не является хорошей идеей в текущих обстоятельствах).
Хорошая идея заключается в том, что было бы неплохо, чтобы компилятор проверил, что все исключения, которые может вызвать программа, будут перехвачены. Недостаток реализации заключается в том, что для этого Java заставляет вас иметь дело с исключением непосредственно в любом классе, вызывающем все, что объявлено для создания проверенного исключения. Одна из самых основных идей (и преимуществ) обработки исключений состоит в том, что в случае ошибки она позволяет промежуточным уровням кода, которые не имеют ничего общего с конкретной ошибкой, полностью игнорировать ее существование. Проверенные исключения (как реализовано в Java) не позволяют этого, тем самым уничтожая главное (основное?) Преимущество обработки исключений для начала.
Теоретически, они могли бы сделать проверенные исключения полезными, применяя их только на уровне всей программы - то есть, «собирая» программу, строили дерево всех путей управления в программе. Различные узлы в дереве будут помечены 1) исключениями, которые они могут генерировать, и 2) исключениями, которые они могут перехватить. Чтобы убедиться, что программа верна, вы должны были пройтись по дереву и убедиться, что каждое исключение, которое было сгенерировано на любом уровне дерева, было перехвачено на каком-то более высоком уровне дерева.
Причина, по которой они этого не сделали (я полагаю, в любом случае), заключается в том, что это будет мучительно сложно - на самом деле, я сомневаюсь, что кто-то написал систему сборки, которая может сделать это для чего угодно, кроме очень простого (граничащего с игрушкой) ") языки / системы. Для Java такие вещи, как динамическая загрузка классов, делают это еще сложнее, чем во многих других случаях. Хуже того (в отличие от чего-то вроде C) Java (по крайней мере, обычно) не компилируется статически / не связана с исполняемым файлом. Это означает, что ничто в системе на самом деле не имеет глобальной осведомленности даже для того, чтобы пытаться выполнять такого рода принудительные меры, пока конечный пользователь фактически не начнет загружать программу для ее запуска.
Осуществление правоприменения в этот момент нецелесообразно по нескольким причинам. Во-первых, даже в лучшем случае это увеличит время запуска, что уже является одной из самых больших и распространенных жалоб на Java. Во-вторых, чтобы сделать много хорошего, вам действительно нужно обнаружить проблему достаточно рано, чтобы программист мог ее исправить. Когда пользователь загружает программу, уже слишком поздно делать что-то хорошее - в этот момент ваш единственный выбор - игнорировать проблему или вообще отказаться от загрузки / запуска программы, если есть вероятность, что возникнет исключение. это не было поймано.
Как таковые, проверенные исключения хуже, чем бесполезные, но альтернативные варианты проверенных исключений еще хуже. Хотя основная идея для проверенных исключений кажется хорошей, на самом деле она не очень хороша и оказывается особенно плохо подходящей для Java. Для чего-то вроде C ++, который обычно компилируется / связывается в законченный исполняемый файл без ничего похожего на рефлексию / динамическую загрузку классов, у вас будет немного больше шансов (хотя, откровенно говоря, даже тогда их правильное применение без того же беспорядка, который они в настоящее время причина в Java все еще вероятно была бы вне текущего уровня техники).