handling - java throw exception with message
¿Qué hace "Throws" y cómo es útil? (5)
La palabra clave throws
declara que la excepción puede descartarse del método.
También puede usar un bloque catch para capturar una excepción dentro del método. Si lo atrapa y no lo vuelve a lanzar, entonces no se lo descarta.
Una declaración throws
permite la verificación en tiempo de compilación de un método:
- Captura las excepciones que arroja, incluidas las de los métodos que llama.
- O los declara, para que sus llamadores puedan hacer el mismo control.
Esta pregunta ya tiene una respuesta aquí:
- La palabra clave throws para excepciones en Java 4 respuestas
Soy nuevo en Java y acabo de encontrar un tutorial que utiliza la palabra clave "Tiros" en un método. He investigado un poco sobre esto pero todavía no lo entiendo.
Por lo que he visto hasta ahora, le está diciendo al compilador que se puede lanzar una cierta excepción en ese método en particular. ¿Por qué tenemos que decirle esto al compilador? He hecho muchos programas usando meramente una declaración try-catch en mis métodos y ha funcionado bien, seguramente son estas declaraciones try-catch las que manejan las excepciones, ¿verdad?
Los programas Java emiten excepciones cada vez que se producen. Sin embargo, habrá momentos en los que desee lanzar manualmente la excepción, ya que se utiliza esta palabra clave throws
.
Por ejemplo: class Abc { public static void main(String args[]) throws IOException{ }}
Más arriba sí, algún método tendrá que atrapar la excepción que se arroja. Como dijiste, son los bloques try-catch los que los administran.
Sin embargo, hay una excepción, y esa es la RuntimeException , para la cual no necesita declarar la parte de excepción throws. RuntimeException (y todas sus subclases) se llaman excepciones sin marcar, después de lo cual, por lo general, no se puede recuperar.
Throws es un mecanismo para lanzar la excepción al método de llamada. Esto generalmente se usa para arrojar la excepción a un nivel donde se puede manejar.
Un ejemplo práctico es una aplicación basada en GUI con alguna lógica de back-end. Si hay un problema en el back-end, es posible que desee mostrar un mensaje adecuado al usuario. Por lo tanto, desde su back-end puede lanzar la excepción hasta sus clases de interfaz de usuario y luego puede mostrar un mensaje en consecuencia.
Puedes administrar una excepción dentro de un método usando try
y catch
como dices. En ese caso, no es necesario usar throws
. Por ejemplo:
public void myMethod()
{
try {
/* Code that might throw an exception */
}
catch (SpaceInvadersException exception) {
/* Complicated error handling code */
}
}
Pero supongamos que tiene mil métodos, todos los cuales podrían arrojar una SpaceInvadersException
. Entonces terminarías teniendo que escribir todo el complicado código de manejo de errores mil veces. Por supuesto, siempre puedes crear una clase ErrorHandler
con un método dealWithSpaceInvadersException()
que puedas llamar, pero aún así estarás atrapado con miles de bloques try
- catch
.
En cambio, le dice al compilador que cada uno de estos mil métodos podría arrojar una SpaceInvadersException
. Entonces, cualquier método que invoque uno de estos métodos debe tratar el error en sí mismo, ya sea mediante un try
- catch
o diciéndole al compilador que podría arrojar una SpaceInvadersException
. Esto se hace usando la palabra clave throws
, como esta:
public void myMethod() throws SpaceInvadersException
{
/* Code that might throw an exception */
}
public void callingMethod()
{
try {
myMethod();
}
catch (SpaceInvadersException exception) {
/* Complicated error handling code */
}
}
En ese caso, debe informar al compilador que myMethod
podría arrojar una myMethod
SpaceInvadersException
. Esto significa que no puede llamar a ese método sin tratar la excepción de alguna manera ( try
- catch
o usando la palabra clave throws
en el método de llamada). Si los throws
no estuvieran allí, podría llamar al método sin hacer ningún manejo de excepción, y obtener una excepción que no haya sido tratada en ninguna parte del programa (lo cual sería malo).
Dado que siempre es mejor evitar la duplicación de código, normalmente es mejor evitar el manejo de errores para try
- catch
una función de nivel mucho más alto que tratarlo por separado en todos los métodos de bajo nivel. Es por eso que este mecanismo existe.