Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manejo de excepciones
13.1 Introduccin
Una excepcin es una indicacin de un problema que ocurre durante la ejecucin de un programa. El manejo de excepciones permite a los programadores crear aplicaciones que puedan resolver las excepciones.
// Fig. 13.1: DivisionEntreCeroSinManejoDeExcepciones.java // Una aplicacin que trata de realizar una divisin entre cero. import java.util.Scanner; public class DivisionEntreCeroSinManejoDeExcepciones { // demuestra el lanzamiento de una excepcin cuando ocurre una divisin entre cero public static int cociente( int numerador, int denominador ) { return numerador / denominador; // posible divisin entre cero } // fin del mtodo cociente public static void main( String args[] ) { Scanner explorador = new Scanner( System.in ); // objeto Scanner para entrada System.out.print( "Introduzca un numerador entero: " ); int numerador = explorador.nextInt(); System.out.print( "Introduzca un denominador entero: " ); int denominador = explorador.nextInt(); int resultado = cociente( numerador, denominador ); System.out.printf( "\nResultado: %d / %d = %d\n", numerador, denominador, resultado ); } // fin de main } // fin de la clase DivisionEntreCeroSinManejoDeExcepciones
Introduzca un numerador entero: 100 Introduzca un denominador entero: 0 Exception in thread main java.lang.ArithmeticException: / by zero at DivisionEntreCeroSinManejoDeExcepciones.cociente( DivisionEntreCeroSinManejoDeExcepciones.java:10) at DivisionEntreCeroSinManejoDeExcepciones.main( DivisionEntreCeroSinManejoDeExcepciones.java:22) Introduzca un numerador entero: 100 Introduzca un denominador entero: hola Exception in thread main java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:840) at java.util.Scanner.next(Scanner.java:1461) at java.util.Scanner.nextInt(Scanner.java:2091) at java.util.Scanner.nextInt(Scanner.java:2050) at DivisionEntreCeroSinManejoDeExcepciones.main( DivisionEntreCeroSinManejoDeExcepciones.java:20)
// Fig. 13.2: DivisionEntreCeroConManejoDeExcepciones.java Un ejemplo de manejo de excepciones que verifica la divisin entre cero. import java.util.InputMismatchException; import java.util.Scanner; public class DivisionEntreCeroConManejoDeExcepciones { // demuestra cmo se lanza una excepcin cuando ocurre una divisin entre cero public static int cociente( int numerador, int denominador ) throws ArithmeticException { return numerador / denominador; // posible divisin entre cero } // fin del mtodo cociente
Java garantiza que si se proporciona un bloque finally, se ejecutar sin importar que se lance o no una excepcin en el bloque try correspondiente, o en uno de sus correspondientes bloques catch. Java tambin garantiza que un bloque finally se ejecutar si un bloque try sale mediante el uso de una instruccin return, break o continue. Si una excepcin que ocurre en el bloque try no se puede atrapar mediante uno de los manejadores catch asociados a ese bloque try, el programa ignora el resto del bloque try y el control pasa al bloque finally, que libera el recurso. Despus, el programa pasa al siguiente bloque try exterior; por lo general, en el mtodo que hace la llamada. Si un bloque catch lanza una excepcin, de todas formas se ejecuta el bloque finally. Despus, la excepcin se pasa al siguiente bloque try exterior; por lo general, en el mtodo que hizo la llamada. Los programadores pueden lanzar excepciones mediante el uso de la instruccin throw. Una instruccin throw especifica un objeto a lanzar. El operando de una instruccin throw puede ser de cualquier clase que se derive de Throwable.
// Fig. 13.5: UsoDeExcepciones.java // Demostracin del mecanismo de manejo de excepciones try...catch...finally. public class UsoDeExcepciones { public static void main( String args[] ) { try { lanzaExcepcion(); //llama al mtodo lanzaExcepcion } // fin de try catch ( Exception excepcion ) // excepcin lanzada por lanzaExcepcion { System.err.println( "La excepcion se manejo en main" ); } // fin de catch } // fin13.5 de main Figura Mecanismo de manejo de excepciones trycatchfinally. (Parte 1 de 2). // demuestra los bloques try...catch...finally public static void lanzaExcepcion() throws Exception { try // lanza una excepcin y la atrapa de inmediato { System.out.println( "Metodo lanzaExcepcion" ); throw new Exception(); // genera la excepcin } // fin de try catch ( Exception excepcion ) // atrapa la excepcin lanzada en el bloque try { System.err.println( "La excepcion se manejo en el metodo lanzaExcepcion" ); throw excepcion; // vuelve a lanzar para procesarla ms adelante noLanzaExcepcion();
// Fig. 13.6: UsoDeExcepciones.java // Demostracin de la limpieza de la pila. public class UsoDeExcepciones { public static void main( String args[] ) { try // llama a lanzaExcepcion para demostrar la limpieza de la pila
// Fig. 13.7: UsoDeExcepciones.java // Demostracin de getMessage y printStackTrace de la clase Exception. public class UsoDeExcepciones { public static void main( String args[] ) { try { metodo1(); // llama a metodo1 } // fin de try
La excepcion se lanzo en metodo3 java.lang.Exception: La excepcion se lanzo en metodo3 at UsoDeExcepciones.metodo3(UsoDeExcepciones.java:49) at UsoDeExcepciones.metodo2(UsoDeExcepciones.java:43) at UsoDeExcepciones.metodo1(UsoDeExcepciones.java:37) at UsoDeExcepciones.main(UsoDeExcepciones.java:10) Rastreo de la pila de getStackTrace: Clase Archivo UsoDeExcepciones UsoDeExcepciones.java UsoDeExcepciones UsoDeExcepciones.java UsoDeExcepciones UsoDeExcepciones.java UsoDeExcepciones UsoDeExcepciones.java
13.10 Excepciones encadenadas Las excepciones encadenadas permiten que un objeto de excepcin mantenga la informacin de rastreo de la pila completa, incluyendo la informacin acerca de las excepciones anteriores que provocaron la excepcin actual.
// Fig. 13.8: UsoDeExcepcionesEncadenadas.java Demostracin de las excepciones encadenadas.
Linea 49 43 37 10
public class UsoDeExcepcionesEncadenadas { public static void main( String args[] ) { try { metodo1(); // llama a metodo1 } // fin de try catch ( Exception excepcion ) // excepciones lanzadas desde metodo1
13.11 Declaracin de nuevos tipos de excepciones Una nueva clase de excepcin debe extender a una clase de excepcin existente, para asegurar que la clase pueda usarse con el mecanismo de manejo de excepciones. 13.12 Precondiciones y poscondiciones La precondicin de un mtodo es una condicin que debe ser verdadera al momento de invocar el mtodo. La poscondicin de un mtodo es una condicin que es verdadera una vez que regresa el mtodo con xito. Al disear sus propios mtodos, debe establecer las precondiciones y poscondiciones en un comentario antes de la declaracin del mtodo. 13.13 Aserciones Dentro de una aplicacin, los programadores pueden establecer condiciones que asuman como verdaderas en un punto especfico. Estas condiciones, conocidas como aserciones, ayudan a asegurar la validez de un programa al atrapar errores potenciales e identificar posibles errores lgicos. Java incluye dos versiones de una instruccin assert para validar las aserciones mediante la programacin. Para habilitar las aserciones en tiempo de ejecucin, use el modificador ea al ejecutar el comando java.
// Fig. 13.9: PruebaAssert.java // Uso de assert para verificar que un valor absoluto sea positivo import java.util.Scanner; public class PruebaAssert { public static void main( String args[] ) { Scanner entrada = new Scanner( System.in ); System.out.print( "Escriba un numero entre 0 y 10: " ); int numero = entrada.nextInt(); // asegura que el valor absoluto sea >= 0 assert ( numero >= 0 && numero <= 10 ) : "numero incorrecto: " + numero; System.out.printf( "Usted escribio %d\n", numero ); } // fin de main } // fin de la clase PruebaAssert
Escriba un numero entre 0 y 10: 5 Usted escribio 5 Escriba un numero entre 0 y 10: 50 Exception in thread "main" java.lang.AssertionError: numero incorrecto: 50 at PruebaAssert.main(PruebaAssert.java:15)