Primero te daré un ejemplo (pero al final es la respuesta por qué la controversia).
Supongamos que está editando un documento en un editor de documentos basado en Java y, una vez que haya terminado, elija Archivo-> Guardar como ... y elija guardar el documento en un volumen para el que no tiene permiso de escritura. El Editor no se estrellaría con una fea traza de pila, simplemente le diría que no puede guardar el archivo y le permitirá continuar editando y / o guardar en otra ubicación.
En tal caso, es probable que se esperara una excepción comprobada, atrapada y actuada para recuperarse gentilmente de ella.
Por otro lado, suponga que se trata de una división por cero o una excepción de puntero nulo causada por un error de programación que muestra su cabeza fea solo en ciertas condiciones. Eso podría suceder en cualquier parte del código, la RAM puede estar dañada, etc. Ningún documento de API le diría "este método arrojaría una división por cero si la RAM está dañada" .
Las excepciones marcadas deben ser parte del diseño y los usuarios de esa API deben prepararse para manejarlas. Las excepciones no verificadas pueden ocurrir en casi todas partes y están fuera de nuestro control.
La controversia surge de los programadores que usan excepciones no verificadas (que se extienden desde RuntimeException) cuando deberían usar excepciones marcadas:
- como un shorcut para no ser molestado por el compilador
- para hacer que sus firmas se vean más simples
- porque consideran que las excepciones marcadas son un problema de dependencia (si arroja una nueva excepción marcada en una clase de implementación, debe modificar la firma de la interfaz) y viceversa.