Esto surgió en una discusión con un colega hoy.¿Cuál es el uso previsto de IllegalStateException?
El Javadocs para el estado de Java IllegalStateException
que:
Señales de que un método que se ha invocado en un momento ilegal o inapropiada. En otras palabras, el entorno Java o la aplicación Java no se encuentran en un estado apropiado para la operación solicitada.
Y dice Effective Java (artículo 60, página 248):
Otra excepción es comúnmente reutilizados IllegalStateException. En general, esta es la excepción a throw si la invocación es ilegal debido al estado del objeto receptor. Por ejemplo, esta sería la excepción para tirar si la persona que llama intenta utilizar algún objeto antes de que se haya inicializado correctamente.
Parece que hay un poco de discrepancia aquí. La segunda oración de los javadocs hace que parezca que la excepción podría describir una condición muy amplia sobre el estado de ejecución de Java, pero la descripción en Java efectivo hace que suene como si se usara para condiciones relacionadas específicamente con el estado del objeto cuyo método ha sido llamado.
Los usos que he visto en el JDK (por ejemplo, colecciones, Matcher
) y en Guava definitivamente parecen pertenecer a la categoría sobre la que habla Effective Java ("Este objeto está en un estado donde no se puede llamar este método "). Esto también parece consistente con IllegalStateException
's hermano IllegalArgumentException
.
¿Existen usos legítimos de IllegalStateException
en el JDK que se relacionen con el "entorno Java" o la "aplicación Java"? ¿O alguna guía de mejores prácticas recomienda usarla para un estado de ejecución más amplio? Si no, ¿por qué demonios son los javadocs redactados así? ;)
En una nota tal vez no relacionada, noté que la etiqueta [illegalstatexception] de StackOverflow dice 'En Java, una excepción que ocurre cuando se usan múltiples hilos, por lo que un hilo modifica un objeto de una manera incompatible con el uso de ese objeto en el segundo hilo, poniendo el objeto en un estado ilegal. ¿Huh? ¿De donde viene esto? –
La "aplicación Java" es la que usted escribe, y puede usar 'IllegalStateException' allí (ya sea directamente o porque está usando Guava, por ejemplo). ¿Dónde está la discrepancia? –
La etiqueta wiki parece falsa, he enviado una edición al tomar prestado generosamente de esta pregunta; Debería ver la nueva versión una vez que haya pasado la revisión por pares. – meriton