Java: diferencias entre throw y throws
Las excepciones
Las excepciones en Java no son más que clases especializadas que, como su nombre indica, representan excepciones, errores o fallos que se producen en las instrucciones de nuestros programas pero, al contrario que los errores de sintaxis, estas fallas se producen en tiempo de ejecución.
Ejemplos de errores de estos tipos sería por ejemplo bien la división por cero o bien cuando un objeto es null o bien si un fichero no se abre de forma correcta.
package excepciones;
public class Excepciones {
public static int dividendo=5;
public static int divisor=0;
public static void main(String[] args) {
System.out.println(dividendo/divisor);
}
}
El código visto en la zona superior no nos error de sintaxis alguno. El problema radica cuando ponemos en funcionamiento el programa. Como nuestra salida es por consola observaremos la siguiente línea:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at excepciones.Excepciones.main(Excepciones.java:8)
Como observamos nos muestra un error aritmético java.lang.ArithmeticException puesto que no se puede utilizar un divisor cero (/ by zero) en esta operación.
Throwable
Para tratar los errores Java cuenta con clases especialmente creadas para el tratamiento de errores en tiempo de ejecución.
Como son tantos los errores que se producen sería inútil explicar punto por punto todos los tipos de excepciones o fallos.
Nuestro trabajo, experiencia (a base de preguntar) nos indicará como obrar en cada caso.
Como hemos dicho uando en Java se produce una excepción se instancia un objeto de una determina clase (dependiendo del tipo de error que se haya producido), que mantendrá la información sobre el error producido y nos proporcionará los métodos necesarios para obtener dicha información.
Estas clases tienen como clase padre la clase Throwable, por tanto se mantiene una jerarquía en las excepciones. A continuación mostramos algunas de las clases para que nos hagamos una idea de la jerarquía que siguen las excepciones, pero existen muchísimas más excepciones que las que mostramos:
Esto implica que por ejemplo si queremos tratar un error obtenido en tiempo de ejecución de un objeto que nos devuelve null con la clase NullPointerException utilizaremos métodos propios o heredados. Por ejemplo el método getMessage();
getMessage()
Returns the detail message string of this throwable.
El código superior es obtenido de la clase padre Throwable y heredado por NullPointerException
try..catch, throw, throws
Ya hemos visto lo que son las excepciones ahora veremos cómo tratarlas.
Lo importante es que en el momento de ejecutar o en la ejecución de un programa los errores que tengamos debemos manejarlas con los respectivos bloques de try - catch.
Sin throw/throws
No siempre es necesario capturar la excepción con la palabras reservadas throw/throws. A veces simplemente realizando una operación se produce el error en tiempo de ejecución.
En el ejemplo que viene a continuación cómo al intentar dividir un número con el divisor a cero nos da un error en tiempo de ejecución. Para corregirlo se realiza la operación en el try. Es como decir “intenta realizar la operación”. En el caso que de error podemos capturar el error el catch.
public class Excepciones {
public static int dividendo = 5;
public static int divisor = 0;
public static void main(String[] args) {
try {
System.out.println(dividendo / divisor);
} catch (ArithmeticException e) {
System.err.println(e);//también podría poner e.getMessage()
}
}
}
throws
La palabra reservada o cláusula throws permite lanzar un método. Por tanto tiene que ir declarada en el método. Veamos el mismo ejemplo que el anterior.
package excepciones;
public class Excepciones {
public static int dividendo = 5;
public static int divisor = 0;
public static void main(String[] args) {
try {
dividir();
} catch (ArithmeticException e) {
System.err.println(e);// también podría poner e.getMessage()
}
}
public static void dividir() throws ArithmeticException {
System.out.println(dividendo / divisor);
}
}
Otra variante del mismo código:
package excepciones;
public class Excepciones {
public static int dividendo = 5;
public static int divisor = 0;
public static void main(String[] args) {
dividir();
}
public static void dividir() throws ArithmeticException {
try {
System.out.println(dividendo / divisor);
} catch (ArithmeticException e) {
System.err.println(e);// también podría poner e.getMessage()
}
}
}
throw
Esta palabra reservada nos permite lanzar una excepción propia.
package excepciones;
public class Excepciones {
public static int dividendo = 5;
public static int divisor = 0;
public static void main(String[] args) {
dividir();
}
public static void dividir() {
try {
if (divisor == 0)
throw new IllegalArgumentException("No se puede dividir por cero");
System.out.println(dividendo / divisor);
} catch (IllegalArgumentException e) {
System.err.println(e);// también podría poner e.getMessage()
}
}
}
Muy buen aporte, muchas gracias
Muy buena aplicación
gracias por aportación
cuando es obligatorio colocar el throws ?