
08 Curso de Java OO. Manejo de Excepciones
Resumen: Se estudiara conceptos básicos para el manejo de excepciones, try, catch, finally, throw, throws.
1. EXCEPCIONES
1.1. Definiciones
Que es una excepción? Es un evento que interrumpe la ejecución de un programa
- Usar un índice fuera de los limites de un arreglo
- Dividir entre cero
- Realizar métodos de objetos nulos.
Que es un error?
En java es cuando la situación es irrecuperable y termina el programa.
- No hay memoria para correr JVM
- Errores internos en JVM
Cual es la diferencia?
Una excepción se puede controlar en el programa. Un error no.
1.2. Características del Java
Cuando ocurre una excepción en un método, Java lanza (throws) una excepcion (Exception).
El objeto Exception generado contiene el tipo de excepción, y el estado del programa cuando ocurrió el error.
Separando el manejo de errores
El manejo de excepciones en java permite separarlos del algoritmo principal.
El resultado es un código mas legible y menos propenso a errores de programación.
Manejo tradicional de errores.
int leerRegistroArchivo() {
abrirArchivo();
if (errorAbrirArchivo) {
else {
if (errorLeerArchivo) {
errorCode = READ_ERROR;
if (errorCerrarArchivo) {
Manejo de excepciones en Java.
leerRegistroArchivo() {
leerArchivo();
cerrarArchivo();
catch (errorAbrirArchivo) {
catch (errorLeerArchivo) {
catch (errorCerrarArchivo) {
Java separa los detalles del manejo de errores del código principal, obteniéndose un código mas legible y menos propenso a errores de codificación.
1.3. Excepciones
Devolviendo la excepción hasta el manejador de excepciones.
No se requiere que cada método invocado maneje la excepción, sino únicamente lo hará el primer manejador de excepciones de la lista de métodos invocados.
Maneo Tradicional de errores
El método4 retorna el código de error al método3.
El método3 retorna el código de error al método2
El método2 retorna el código de error al metodo1
El metodo1 maneja el error.
Excepciones en Java
El metodo4 lanza una excepción
El metodo1 captura la excepción y la maneja
Las excepciones no pueden ignorarse
Una vez que un método lanza un error no puede ignorarse a diferencia de la programación tradicional donde se debe controlar en cada punto de invocación.
Maneo Tradicional de errores
1.4. Throwable
Todos los errores y excepciones heredan de la clase Throwable
Errores.
Heredan de la clase Error; estos se generan cuando ocurren errores fatales para el programa como por ejemplo: cuando la memoria esta llena o cuando es imposible encontrar una clase requerida.
Excepciones no controladas
Heredan de la clase RuntimeException.
Estas ocurren cuando por ejemplo se divide entre cero o se intenta acceder a un elemento del arreglo fuera de sus limites.
Mediante código se puede capturar, manipular o ignorar estas excepciones.
Si no maneja el error, el java terminara el programa indicando el estado del error.
Excepciones controladas
Heredan de la clase Exception.
Estas deben ser capturadas y manejadas en algun lugar de la aplicación.
Las excepciones creadas por el programador seran heredadas de la clase Exception.
1.5. Que se puede hacer con una Excepción?
Excepciones controladas
Se puede:
- Capturar la excepción y manipularla
- Pasar la excepción al método invocador.
- Capturar la excepción y lanzar una excepción diferente.
Excepciones no controladas
No necesitan ser controladas en el código.
El JVM terminara el programa cuando las encuentra.
Si no desea que el programa termine tendrá que manejarlas.
2. EXCEPCIONES CON JAVA
2.1. Como capturar y manejar una excepción
- Encierre el código del método en un bloque try
- Maneje cada exception en un bloque catch.
- Cualquier proceso final realícelo en un bloque finally. Este bloque siempre se ejecutara, ocurra o no una excepción.
try {
catch (exception1) {
catch (exception2) {
...
finally {
La documentación del java indicara que excepciones lanzan los métodos en java.
Clase : java.io.FileInputStream
Constructor: public FileInputStream(String name) throws FileNotFoundException
Método: public int read() throws IOException
2.2. Capturando una excepción.
Este ejemplo convierte una cadena en un entero
int cantidad;
String cadena = "5";
try {
catch ( NumberFormatException e) {
Laboratorio:
Pruebe este ejemplo en un programa TestException.java. Cambie la cadena por "cinco", "1.1", "2f".
2.3. Capturando múltiples excepciones
Este ejemplo convierte una cadena en un entero y realiza una division.
public class TestMultiException {
int divisor = 0;
String cadena = "5";
System.out.println(cantidad);
int resultado = cantidad / divisor;
System.out.println(resultado);
catch ( NumberFormatException e) {
catch ( ArithmeticException e) {
}
Laboratorio:
Pruebe este ejemplo en un programa TestMultiException.java. Cambie la cadena por "cinco", "1.1", "5" y divisor cambie por 0, 1, 500
2.3. Ejecución del bloque finally
El bloque finally siempre se ejecuta dependiendo como se termina el bloque try.
- Hasta terminar la ultima sentencia del bloque try.
- Debido a sentencias return o break en el bloque try.
- Debido a una excepción.
public class TestFinally {
int cantidad= 0;
int divisor = 0;
String cadena = "5";
try {
return;
cantidad = Integer.parseInt(cadena);
System.out.println(cantidad);
int resultado = cantidad / divisor;
System.out.println(resultado);
catch ( NumberFormatException e) {
catch ( ArithmeticException e) {
finally {
}
Laboratorio:
Pruebe este ejemplo, cambie la cadena por "cinco", "1.1", "5" y divisor cambie por 0, 1, 500
2.4. Como pasar la excepción al método invocado.
Para pasar el método al invocador, se declara con la declaración throws.
La excepción se propaga al método que lo invoco.
En el ejemplo, las excepciones de los métodos se manejan en el método invocador.
public void metodoInvocador() {
getResultado();
catch {
finally {
public int miMetodo() throws Exception {
public int getResultado() throws NumberFormatException {
TestThrows.java
public class TestThrows {
int posicion = 6;
char letra = ' ';
System.out.println(letra );
catch (IndexOutOfBoundsException e) {
public static char getLetra(String cadena, int posicion)
throws IndexOutOfBoundsException
{
return c;
Laboratorio. Cambie posición 6 por –1, 0, 1
2.5. Como lanzar una excepción
Para lanzar una excepción use las declaraciones throws y throw
Puede crear excepciones para manejar posibles problemas en el código.
public String getValor(int indice) throws IndexOutOfBoundsException {
2.6. Como crear una excepción
Para crear su propia excepción tiene que heredarla de la clase Exception.
Puede ser usado en caso quiera tratar cada problema en el código en forma diferente.
Por ejemplo el manejo del archivo1 puede tratarlo con una excepción1. El manejo de un archivo2 puede tratarlo con una excepcion2. Cada archivo tendria su propia excepción.
UserFileException.java
public class UserFileException extends Exception {
2.7. Como capturar una excepción y lanzar otra diferente.
En el ejemplo si ocurre un problema de IO (entrada/salida) se captura la excepción y se lanza una excepción propia.
public void ReadUserFile throws UserFileException {
catch (IOException e) {
3. LABORATORIO
Ensaye este ejemplo que muestra el uso de excepciones definidas por el usuario.
public class CerradoException extends Exception {
public CerradoException () {}
public CerradoException (String msg) {
super(msg);
}
}
public class TestCerradoException {
e.printStackTrace(System.err);
try {
// similar a System.out.
e.printStackTrace(System.err);
public static void abrirLaPuerta() throws CerradoException {
throw new CerradoException ("Originado en abrirLaPuerta()");
public static void abrirLaVentana() throws CerradoException {
throw new CerradoException ("Originado en abrirLaVentana()");
4. EJERCICIO
Agregue los siguientes métodos al programa TestExcepcionTeclado.java. Cree excepciones para su control.
// método que lea solo un carácter.
public static char readChar(String etiqueta)...
// método que lea un decimal con enteros y decimales.
public static float readNumber(String etiqueta, int enteros, int decimales)...
// método que lea una dirección IP xxx.xxx.xxx.xxx
// 0 <= xxx <= 255
public static String readIP(String etiqueta)...
// método que lea un codigo valido de alumno UNI
public static String readCodigoUNI(String etiqueta)...
// método que lea una fecha valida
// formato dd/mm/yyyy
public static String readDate(String etiqueta)
TestExcepcionTeclado.java
import java.io.*;
public class TestExcepcionTeclado {
try {
System.out.println("Su longitud es "+nombre.length());
int entero = readInt("Ingrese un entero: ");
System.out.println("El cuadrado es "+entero*entero);
catch (NumberFormatException e) {
e.printStackTrace(System.err);
catch (ArithmeticException e) {
e.printStackTrace(System.err);
catch (IndexOutOfBoundsException e) {
e.printStackTrace(System.err);
catch (Exception e) {
e.printStackTrace(System.err);
}
public static String readString(String etiqueta)
throws Exception
{
String cadena="";
BufferedReader in = new BufferedReader(new
InputStreamReader(System.in));
cadena = in.readLine();
return cadena;
public static int readInt(String etiqueta)
throws Exception
{
String cadena = readString(etiqueta);
Integer enteroInteger = new Integer( cadena.trim());
entero = enteroInteger.intValue();
return entero;