Uso de la sentencia try Ahora que ya sabe lo que son excepciones , vamos a explorar cómo manejarlos . Java utiliza un try declaración de separar la lógica que podría lanzar una excepción de la lógica de manejar que excepción. La figura 6.2 muestra la sintaxis de una sentencia try . FIGURA 6 . 2 La sintaxis de una sentencia try El código en el bloque try se ejecuta normalmente. Si cualquiera de los estados lanzar una excepción que pueden ser capturados por el tipo de excepción que figuran en el bloque catch , el bloque try deja de funcionar y la ejecución pasa a la sentencia catch . Si ninguna de las declaraciones en el bloque try lanzar una excepción que puede ser capturado , la cláusula catch no se ejecuta . Usted probablemente ha notado la palabra "bloqueo " y " cláusula " que se utiliza indistintamente. los examen hace esto así , por lo que están consiguiendo que utilizó para ello. Ambos son correctos. " Bloque" es correcta porque hay apoyos presentes . " Cláusula " es correcta , ya que son parte de una declaración de tratar . No hay un montón de reglas de sintaxis aquí . Se requieren las llaves para la oportunidad y bloques catch . En nuestro ejemplo , la niña se levanta por sí misma la primera vez que cae . Esto es lo que esta parece: 3: void explore() { 4: try { 5: fall(); 6: System.out.println("never get here"); 7: } catch (RuntimeException e) { 8: getUp(); 9: } 10: seeAnimals(); 11: } 12: void fall() { throw new RuntimeException(); } En primer lugar, la línea 5 llama al método caída ( ) . La línea 12 inicia una excepción . Esto significa Java salta directamente al bloque catch , saltándose la línea 6. La chica se levanta en la línea 8. Ahora el intento declaración es una y la ejecución continúa normalmente con la línea 10 . Ahora vamos a ver algunas declaraciones try no válidos que el examen podría tratar de engañarlo con . ¿Ves lo que está mal con éste? try // DOES NOT COMPILE fall(); catch (Exception e) System.out.println("get up"); The problem is that the braces are missing. It needs to look like this: try { fall(); } catch (Exception e) { System.out.println("get up"); } las sentencias try son como los métodos en que las llaves se requieren incluso si sólo hay un estado de cuenta dentro de los bloques de código . si las declaraciones y los bucles son especiales en este sentido como que le permiten omita las llaves . ¿Qué tal este? try {// DOES NOT COMPILE fall(); } Este código no compilará porque el bloque try no tiene nada después de ella. Recuerde , la punta de una sentencia try es algo que sucede si una excepción es lanzado. Sin otra cláusula, la sentencia try es solitario . Ahora que sabes lo básico , vamos a empezar a añadir más características a excepciones . El seguimiento secciones que muestran cómo agregar una cláusula finalmente a una sentencia try y capturar diferentes tipos de excepciones y describen lo que sucede si se produce una excepción en el catch o finally . Adición de un bloque finally La sentencia try también le permite ejecutar código al final con una cláusula fi nalmente sin tener en cuenta si se produce una excepción . La figura 6.3 muestra la sintaxis de una sentencia try con este funcionalidad adicional. FIGURA 6 . 3 La sintaxis de una sentencia try con finally Hay dos caminos a través de código con tanto una captura y un fin . Si una excepción se lanza , el bloque finally se ejecuta después de que el bloque catch . Si no es una excepción es lanzada , la Por último bloque se ejecuta después del bloque try se completa . Volvamos a nuestro ejemplo niña , esta vez con último: 12: void explore() { 13: try { 14: seeAnimals(); 15: fall(); 16: } catch (Exception e) { 17: getHugFromDaddy(); 18: } finally { 19: seeMoreAnimals(); 20: } 21: goHome(); 22: } La chica cae en la línea 15. Si se levanta por sí misma , el código pasa al bloque finally y se ejecuta la línea 19. A continuación, la sentencia try ha terminado y el código avanza en la línea 21. Si el chica no se levanta por sí misma, se produce una excepción . Las carreras de bloque de captura y ella recibe una abrazo en la línea 17. A continuación, la sentencia try ha terminado y el código avanza en la línea 21. De cualquier manera , el final es el mismo . El bloque finally se ejecuta y termina la sentencia try . En el examen OCA , una sentencia try debe tener los productos y / o finalmente . Habiendo tanto está muy bien. Que ni tiene un problema . En el examen de OCP , se le aprender sobre una sintaxis especial para una sentencia try try- llamada con - recursos que permite una captura ni tampoco un bloque finally . En el examen OCA , se obtiene para asumir una sentencia try es sólo una sentencia try regular y no una trywithdeclaración recursos. El examen tratará de engañar al que le faltan las cláusulas o cláusulas en el orden equivocado . Hacer que se ve por qué el siguiente hacer o no compilar ? 25: try { // DOES NOT COMPILE 26: fall(); 27: } finally { 28: System.out.println("all better"); 29: } catch (Exception e) { 30: System.out.println("get up"); 31: } 32: 33: try { // DOES NOT COMPILE 34: fall(); 35: } 36: 37: try { 38: fall(); 39: } finally { 40: System.out.println("all better"); 41: } El primer ejemplo (líneas 25-31 ) no se compila porque la captura y , finalmente, los bloques están en el orden equivocado . El segundo ejemplo ( líneas 33-35 ) no se compila porque hay debe haber una trampa o bloque finally . El tercer ejemplo ( líneas 37-41 ) es sólo multa . captura no se ha Por último es necesario si está presente . Un problema con finalmente es que cualquier uso realistas para que están fuera del alcance de la examen de OCA . finalmente, se suele utilizar para cerrar los recursos tales como archivos o bases de datos , tanto de los cuales son los temas del examen de OCP . Esto significa que la mayoría de los ejemplos que encuentras en el examen con OCA finalmente se va a parecer artificial . Por ejemplo , usted conseguirá Preguntas tales como qué este código salidas : String s = ""; try { s += "t"; } catch(Exception e) { s += "c"; } finally { s += "f"; } s += "a"; System.out.print(s); La respuesta es TFA . Se ejecuta el bloque try . Dado que se lanza ninguna excepción , Java va directamente al bloque finally . A continuación, se ejecuta el código después de la instrucción try . Sabemos; esta es un ejemplo tonto . Esperar a ver ejemplos de este tipo en el examen de OCA . System.exit Hay una excepción al " bloque finally siempre se ejecuta después de que el bloque catch " regla: Java defi ne un método que se llama como System.exit ( 0 ) ;. El parámetro es el número entero código de error que es retornada . System.exit dice Java, "Stop . Terminar el programa en este momento . No pase ir. No se debe recoger de $ 200. " Cuando System.exit se le llama en el try o captura bloque, finalmente no se ejecuta . La captura de varios tipos de excepciones Hasta ahora , usted ha sido la captura de un solo tipo de excepción. Ahora vamos a ver lo que sucede cuando diferentes tipos de excepciones pueden ser lanzadas desde el mismo método . Creación de sus propias excepciones no está en el examen de OCA , pero es en el examen de OCP . Sin embargo , el examen OCA puede defi ne excepciones básicas que le muestre la jerarquía . Solo hay que hacer dos cosas con esta información . En primer lugar , debe ser capaz de reconocer si el excepción es una excepción o no facturado . En segundo lugar, es necesario determinar si alguno de las excepciones son subclases de los otros. class AnimalsOutForAWalk extends RuntimeException { } class ExhibitClosed extends RuntimeException { } class ExhibitClosedForLunch extends ExhibitClosed { } En este ejemplo, hay tres excepciones personalizadas . Todos son excepciones sin marcar ya que directa o indirectamente se extienden RuntimeException . Ahora cogemos los dos tipos de excepciones y manejarlas imprimiendo el mensaje apropiado : public void visitPorcupine() { try { seeAnimal(); } catch (AnimalsOutForAWalk e) {// first catch block System.out.print("try back later"); } catch (ExhibitClosed e) {// second catch block System.out.print("not today"); } } Existen tres posibilidades para cuando se ejecuta este código. Si seeAnimal ( ) no produce una excepción, no se imprime nada . Si el animal es a dar un paseo , sólo el bloque catch primero carreras. Si la muestra está cerrado , sólo el segundo bloque catch se ejecuta . Existe una regla para el orden de los bloques catch . Java mira en el orden en que Aparecer. Si es imposible que uno de los bloques de captura para ser ejecutado, un error del compilador sobre el código inalcanzable se produce . Esto sucede cuando una superclase es capturado antes de una subclase . Recuerde, nosotros advertimos que prestar atención a las excepciones de las subclases . En el ejemplo puercoespín , el orden de los bloques catch podría revertirse debido a que el excepciones no heredan el uno del otro . Y sí , hemos visto un puercoespín ser tomado por un caminar con una correa . El ejemplo siguiente muestra los tipos de excepciones que no heredan el uno del otro : public void visitMonkeys() { try { seeAnimal(); } catch (ExhibitClosedForLunch e) {// subclass exception System.out.print("try back later"); } catch (ExhibitClosed e) {// superclass exception System.out.print("not today"); } } Si se produce la excepción c ExhibitClosedForLunch más específi , el primer retén fi el bloque se ejecuta . Si no es así , Java comprueba si la superclase ExhibitClosed excepción es lanzada y lo coge . Esta vez , el orden de los bloques catch sí importa. En el reverso se hace no trabajo. public void visitMonkeys() { try { seeAnimal(); } catch (ExhibitClosed e) { System.out.print("not today"); } catch (ExhibitClosedForLunch e) {// DOES NOT COMPILE System.out.print("try back later"); } } Esta vez, si la excepción c ExhibitClosedForLunch más específi es lanzada , la captura bloque para ExhibitClosed corre - que significa que no hay forma de que el segundo bloque de captura de jamás ejecutar . Java nos dice correctamente hay un bloque catch inalcanzable . Vamos a probar esto una vez más. ¿Ves por qué este código no se compila ? public void visitSnakes() { try { seeAnimal(); } catch (RuntimeException e) { System.out.print("runtime exception"); } catch (ExhibitClosed e) {// DOES NOT COMPILE System.out.print("not today"); } catch (Exception e) { System.out.print("exception"); } } Es el mismo problema . ExhibitClosed es un RuntimeException . Si se tira , los primeros bloque catch se encarga de ello , asegurándose de que no hay manera de llegar al segundo bloque catch . Para revisar la captura de múltiples excepciones , recuerda que a lo sumo un bloque catch se ejecutará y será el bloque catch primera que puede manejarlo. Lanzando una segunda excepción Hasta ahora , nos hemos limitado a una sentencia try en cada ejemplo . Sin embargo, una captura o, finalmente, el bloque puede tener cualquier código Java válido en ella, incluyendo otra declaración de tratar . A pesar de que el tema de la lectura de archivos es en el examen OCP , el examen OCA puede preguntarle acerca de la manipulación con esas clases de excepción. Esto es realmente una regalo. Cuando vea una pregunta, usted sabe que el problema tiene que ser sobre la sintaxis de Java básico o el manejo de excepciones ! El siguiente código intenta leer un expediente : 16: public static void main(String[] args) { 17: FileReader reader = null; 18: try { 19: reader = read(); 20: } catch (IOException e) { 21: try { 22: if (reader != null) reader.close(); 23: } catch (IOException inner) { 24: } 25: } 26: } 27: private static FileReader read() throws IOException { 28: // CODE GOES HERE 29: } El caso más sencillo es si la línea 28 no produce una excepción. A continuación, toda la captura en el bloque líneas 20-25 se omiten. A continuación, considere si la línea 28 lanza una NullPointerException. Eso no es una IOException, por lo que el bloque catch en las líneas 20-25 todavía se omitirán. Si la línea 28 hace lanzar una IOException, el bloque catch en las líneas 20-25 se pone de ejecución. Línea 22 intenta cerrar el lector. Si eso va bien, el código se completa y el método main () termina normalmente. Si el método close () hace una excepción, Java busca de más capturas bloques. No hay ninguno, por lo que el principal método que lanza nueva excepción. Independientemente, el excepción en la línea 28 se maneja. Una excepción diferente podría ser lanzado, pero la de la línea 28 se hace. La mayoría de los ejemplos que se ven con el manejo de excepciones en el examen son abstractas. Ellos usar letras o números para asegurarse de que entiende el fl ujo. Éste muestra que sólo el la última excepción de que se lance asuntos. (Esto es cierto para el examen OCA. Se va a cambiar un poco en el examen OCP). 26: try { 27: throw new RuntimeException(); 28: } catch (RuntimeException e) { 29: throw new RuntimeException(); 30: } finally { 31: throw new Exception(); 32: } La línea 27 se produce una excepción , que está atrapado en la línea 28. El bloque catch a continuación, lanza una excepción en la línea 29. Si no hubiera un bloque finally , a excepción de la línea 29 lo haría ser lanzado . Sin embargo, el bloque finally se ejecuta después del bloque try . Desde el bloque finally emite una excepción de su propia en la línea 31 , éste se tira . La excepción de la bloque catch se olvidado. Por esta razón, a menudo se ve otro try / catch dentro de una finally - para asegurarse de que no enmascara la excepción del bloque catch . A continuación vamos a mostrar el ejemplo más duro puede estar relacionado con pedido excepciones. ¿Qué te parece este método devuelve ? Ir lentamente. Es complicado. 30: public String exceptions() { 31: String result = ""; 32: String v = null; 33: try { 34: try { 35: result += "before"; 36: v.length(); 37: result += "after"; 38: } catch (NullPointerException e) { 39: result += "catch"; 40: throw new RuntimeException(); 41: } finally { 42: result += "finally"; 43: throw new Exception(); 44: } 45: } catch (Exception e) { 46: result += "done"; 47: } 48: return result; 49: } La respuesta correcta es la captura antes de finalmente hacer. Todo es normal hasta la línea 35 , cuando " antes " , se añade. Línea 36 lanza una NullPointerException . Línea 37 se omite como Java va directamente al bloque catch . La línea 38 hace detectar la excepción , y " captura " es añadido en la línea 39. A continuación, la línea 40 tiros un RuntimeException . Las carreras por último bloque después la captura , independientemente de si se produce una excepción ; que añade "por fin" al resultado. en este punto , hemos completado la instrucción try interior que corrió en las líneas 34-44 . La captura externa bloque ve entonces una excepción fue arrojado y lo atrapa en la línea 45 ; Añade " hecho" para dar como resultado .