Java no capturó excepciones <Br /> Antes de aprender a manejar excepciones en un programa, es beneficioso ver qué sucede si no las maneja. El siguiente applet incluye una expresión que deliberadamente causa un error de dividido cero.
clase exc0 {public static void main (string args []) {int d = 0;
Cuando el sistema de tiempo de ejecución de Java verifica la situación que se divide por cero, construye un nuevo objeto de excepción y lanza la excepción. Esto hace que la ejecución de EXC0 se detenga, porque una vez que se lanza una excepción, debe ser atrapada por un controlador de excepción y procesarse de inmediato. En este ejemplo, no proporcionamos ninguno de nuestros propios manejadores de excepción, por lo que la excepción es atrapada por el controlador predeterminado del sistema de tiempo de ejecución Java. Cualquier excepción que no sea atrapada por su programa eventualmente será manejada por el controlador predeterminado. El controlador predeterminado muestra una cadena que describe la excepción, imprime la traza de la pila donde ocurre la excepción y termina el programa.
Aquí está la salida generada por el intérprete de tiempo de ejecución de Javajdk estándar para ejecutar el programa:
java.lang.arithmeticexception: / por cero en exc0.main (exc0.java:4)
Tenga en cuenta cómo el nombre de clase EXC0, el nombre del método principal, el nombre del archivo exc0.java y la línea número 4 se incluyen en una simple pista de uso de pila. Además, tenga en cuenta que el tipo de excepción lanzado es una subclase de excepción llamada arithmeticException, que describe más claramente qué tipo de método de error. Discuta más adelante en este capítulo, Java proporciona múltiples tipos de excepción incorporados que coinciden con diferentes tipos de errores de tiempo de ejecución que pueden generarse.
La pista de pila mostrará la secuencia de llamadas de método que dieron como resultado el error. Por ejemplo, aquí hay otra versión del programa anterior que introduce el mismo error, pero el error se genera en otro método que no sea el método Main ():
clase exc1 {static void subrutine () {int d = 0;
Los resultados de la pista de pila del controlador de excepción predeterminado muestran cómo se muestra toda la pila de llamadas:
java.lang.arithmeticException: / por cero en exc1.subroutine (exc1.java:4) en exc1.main (exc1.java:7)
Como puede ver, la parte inferior de la pila es la línea 7 de Main, que llama al método SubRoutine (). Este método causa una excepción en la línea 4. La pila de llamadas es importante para la depuración porque identifica los pasos exactos que conducen al error.
Anidación de declaraciones de prueba de Java
Las declaraciones de prueba pueden estar anidadas. Es decir, una declaración de prueba puede estar dentro de otro bloque de try. Cada vez que ingrese una declaración de prueba, la excepción es la excepción y después de las relaciones se empujarán a la pila. Si una declaración de prueba interna no contiene un controlador de captura con excepciones especiales, la pila aparecerá y el controlador de captura de la próxima declaración de prueba verificará si lo coincide. Este proceso continuará hasta que una declaración de captura coincida con éxito, o hasta que se agoten todas las declaraciones de try anidadas. Si no hay coincidencias de declaración de captura, el sistema de tiempo de ejecución Java manejará esta excepción. Aquí hay un ejemplo del uso de declaraciones de prueba anidada:
// un ejemplo de declaraciones de try anidadas. Classcky {public static void main (string args []) {try {int a = args.length; Divide -By-Zero. Divide -By-cero se generará por el siguiente código. OU T -Of Bounds Exception. e) {System.out.println ("Index de matriz fuera de los límites:" + e);
Como puede ver, el programa anesta otro bloque de try en un bloque de try. El programa funciona de la siguiente manera: cuando ejecuta el programa sin parámetros de línea de comandos, el bloque de try externo generará una excepción dividida por cero. El programa se ejecuta bajo una condición de parámetro de línea de comando, y un error dividido por un bloque de try anidados da como resultado un error divisible. Debido a que el bloque interno no coincide con esta excepción, pasará la excepción al bloque de try externo donde se procesa la excepción. Si ejecuta el programa con dos parámetros de línea de comandos, el bloque de try interno genera una excepción de límite de matriz. Los siguientes resultados ilustran cada caso:
C:/> Java NesttryDivide por 0: java.lang.arithmeticException:/by zeroc:/> java nido oneA = 1Divide by 0: java.lang.arithmeticException:/by zeroc:/> java narttry one twoa = 2array out- Of Bounds: java.lang.arrayindexoUtofboundsexception
Cuando hay una llamada de método, la anidación de las declaraciones de TRY puede ocurrir muy en secreto. Por ejemplo, puede poner una llamada a un método en un bloque de prueba. Dentro de este método, hay otra declaración de try. En este caso, el intento dentro del método todavía está anidado en el bloque de try que llama al método externamente. La siguiente es una modificación del ejemplo anterior, y los bloques de try anidados se mueven al interior del método Nestry ()::
/* Las declaraciones de try se pueden anidar implícitamente a través de llamadas a los métodos. -La excepción cero será generada por el siguiente código. F-Bounds Exception. .out .println ("Index de matriz fuera de los límites:" + e); previamente enviado, la siguiente declaración generará una excepción de división por cero. ) {System.
La salida de este programa es la misma que en el ejemplo anterior.