Como pregunta subjetiva, esto debería estar cerrado, pero como todavía está abierto:
Esto es parte de la política interna utilizada en mi lugar de empleo anterior y funcionó muy bien. Todo esto es de memoria, así que no puedo recordar la redacción exacta. Vale la pena señalar que no utilizaron excepciones marcadas, pero eso está más allá del alcance de la pregunta. Las excepciones no comprobadas que usaron se clasificaron en 3 categorías principales.
NullPointerException: no lance intencionalmente. Los NPE solo deben ser lanzados por la VM cuando se desreferencia una referencia nula. Se deben hacer todos los esfuerzos posibles para garantizar que nunca se arrojen. @Nullable y @NotNull deben usarse junto con herramientas de análisis de código para encontrar estos errores.
IllegalArgumentException: se produce cuando un argumento de una función no se ajusta a la documentación pública, de modo que el error puede identificarse y describirse en términos de los argumentos transmitidos. La situación del OP entraría en esta categoría.
IllegalStateException: se produce cuando se llama a una función y sus argumentos son inesperados en el momento en que se pasan o incompatibles con el estado del objeto del que es miembro el método.
Por ejemplo, había dos versiones internas de IndexOutOfBoundsException usadas en cosas que tenían una longitud. Uno es una subclase de IllegalStateException, utilizada si el índice era mayor que la longitud. La otra, una subclase de IllegalArgumentException, utilizada si el índice era negativo. Esto se debía a que podía agregar más elementos al objeto y el argumento sería válido, mientras que un número negativo nunca es válido.
Como dije, este sistema funciona realmente bien, y le tomó a alguien explicar por qué la distinción existe: "Dependiendo del tipo de error, es bastante sencillo para usted averiguar qué hacer. Incluso si no puede realmente imaginar para averiguar qué salió mal, puede averiguar dónde detectar ese error y crear información de depuración adicional ".
NullPointerException: maneje el caso nulo o ponga una aserción para que no se arroje el NPE. Si pones una afirmación es solo uno de los otros dos tipos. Si es posible, continúe la depuración como si la aserción estuviera allí en primer lugar.
IllegalArgumentException: tienes algo mal en tu sitio de llamadas. Si los valores que se pasan son de otra función, averigüe por qué recibe un valor incorrecto. Si está pasando uno de sus argumentos, el error verifica la pila de llamadas hasta que encuentre la función que no devuelve lo que esperaba.
IllegalStateException: no ha llamado a sus funciones en el orden correcto. Si está utilizando uno de sus argumentos, verifíquelos y arroje una IllegalArgumentException que describa el problema. Luego puede propagar las mejillas contra la pila hasta que encuentre el problema.
De todos modos, su punto era que solo puedes copiar las IllegalArgumentAssertions en la pila. No hay forma de propagar IllegalStateExceptions o NullPointerExceptions en la pila porque tienen algo que ver con su función.