La throws Exception
declaración es una forma automatizada de realizar un seguimiento de los métodos que pueden generar una excepción por razones anticipadas pero inevitables. La declaración suele ser específica sobre el tipo o tipos de excepciones que se pueden generar, como throws IOException
o throws IOException, MyException
.
Todos tenemos o eventualmente escribiremos código que se detiene inesperadamente e informa una excepción debido a algo que no anticipamos antes de ejecutar el programa, como la división por cero o el índice fuera de los límites. Dado que el método no esperaba los errores, no podían "detectarse" ni manejarse con una cláusula try catch. Cualquier usuario desprevenido del método tampoco conocería esta posibilidad y sus programas también se detendrían.
Cuando el programador sabe que pueden ocurrir ciertos tipos de errores pero le gustaría manejar estas excepciones fuera del método, el método puede "lanzar" uno o más tipos de excepciones al método de llamada en lugar de manejarlas. Si el programador no declara que el método (podría) lanzar una excepción (o si Java no tiene la capacidad de declararlo), el compilador no podría saberlo y dependerá del futuro usuario del método conocerlo, captura y maneja cualquier excepción que el método pueda generar. Dado que los programas pueden tener muchas capas de métodos escritos por muchos programas diferentes, resulta difícil (imposible) realizar un seguimiento de los métodos que pueden generar excepciones.
Aunque Java tiene la capacidad de declarar excepciones, aún puede escribir un nuevo método con excepciones no controladas y no declaradas, y Java lo compilará y podrá ejecutarlo y esperar lo mejor. Lo que Java no le permitirá hacer es compilar su nuevo método si usa un método que ha sido declarado como lanzando excepciones, a menos que maneje las excepciones declaradas en su método o declare que su método arroja lo mismo excepción (es) o si hay varias excepciones, puede manejar algunas y lanzar el resto.
Cuando un programador declara que el método genera un tipo específico de excepción, es solo una forma automatizada de advertir a otros programadores que utilizan el método de que es posible una excepción. Luego, el programador puede decidir manejar la excepción o pasar la advertencia declarando que el método de llamada también lanza la misma excepción. Dado que el compilador ha sido advertido de que la excepción es posible en este nuevo método, puede verificar automáticamente si los futuros llamadores del nuevo método manejan la excepción o la declaran y obligan a que suceda una u otra.
Lo bueno de este tipo de solución es que cuando el compilador informa Error: Unhandled exception type java.io.IOException
, da el archivo y el número de línea del método que se declaró para lanzar la excepción. A continuación, puede optar por simplemente pasar la pelota y declarar que su método también "lanza IOException". Esto se puede hacer hasta el método principal, donde luego haría que el programa se detuviera e informara la excepción al usuario. Sin embargo, es mejor detectar la excepción y tratarla de una manera agradable, como explicarle al usuario lo que ha sucedido y cómo solucionarlo. Cuando un método detecta y maneja la excepción, ya no tiene que declarar la excepción. La pelota se detiene allí, por así decirlo.