{"id":2470,"date":"2018-02-28T19:23:12","date_gmt":"2018-03-01T00:23:12","guid":{"rendered":"https:\/\/www.manualjava.net\/?p=2470"},"modified":"2018-03-01T19:21:45","modified_gmt":"2018-03-02T00:21:45","slug":"diseno-de-excepciones","status":"publish","type":"post","link":"https:\/\/www.manualjava.net\/?p=2470","title":{"rendered":"Dise\u00f1o de excepciones"},"content":{"rendered":"<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-2473\" src=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/java40.jpg\" alt=\"\" width=\"250\" height=\"116\" \/><\/p>\n<p><span style=\"color: #000000;\">La palabra reservada\u00a0<strong>try\u00a0<\/strong>designa un bloque try, que es un \u00e1rea de su programa que detecta excepciones. En el interior de bloques try, normalmente se llaman a m\u00e9todos que pueden levantar o\u00a0<strong>lanzar excepciones.\u00a0<\/strong>La palabra reservada <strong>catch<\/strong> designa un manejador de capturas con una signatura que representa un tipo de excepci\u00f3n. Los manejadores de captura siguen inmediatamente a bloques try o a otro manejador catch con un argumento diferente.\u00a0\u00a0<\/span><!--more--><\/p>\n<p><span style=\"color: #000000;\">Los bloques try son importantes ya que sus manejadores de captura asociados determinan cu\u00e1l es la parte de su programa que maneja una excepci\u00f3n espec\u00edfica. El c\u00f3digo que est\u00e1 dentro del manejador de capturas (catch) es donde se decide lo que se hace con la excepci\u00f3n lanzada.<\/span><\/p>\n<p><span style=\"color: #000000;\">Java proporciona un manejador especial, denominado\u00a0<strong>finally.\u00a0<\/strong>Es opcional, de utilizarse debe escribirse despu\u00e9s del \u00faltimo catch(). En general, la finalidad que tiene es liberar recursos asignados en el bloque try, por ejemplo cerrar archivos abiertos en alguna sentencia del bloque try. Este manejador tiene la propiedad de que siempre se ejecuta, una vez que ha terminado el bloque, o bien una vez que una excepci\u00f3n ha sido capturada por el correspondiente catch().<\/span><\/p>\n<h2><span style=\"color: #000000;\"><strong>Bloques try<\/strong><\/span><\/h2>\n<p><span style=\"color: #000000;\">Un bloque <strong>try<\/strong> encierra las sentencias que pueden lanzar excepciones. El bloque comienza con la palabra reservada try seguida por una secuencia de sentencias de programa encerradas entre llaves. A continuaci\u00f3n del bloque try hay una lista de manejadores, llamados <strong>cl\u00e1usulas catch<\/strong>. Al menos un manejador catch debe aparecer inmediatamente despu\u00e9s de un bloque try, o si no hay manejador catch debe especificarse el manejador\u00a0<strong>finally.\u00a0<\/strong>Cuando un tipo de excepci\u00f3n lanzada coincide con el argumento de un catch, el control se reanuda dentro del bloque del manejador catch. Si ninguna excepci\u00f3n se lanza desde un bloque try, una vez que terminan las sentencias del bloque, prosigue la ejecuci\u00f3n a continuaci\u00f3n del \u00faltimo catch. Si hay manejador finally (es opcional), la ejecuci\u00f3n sigue por sus sentencias; una vez terminadas, contin\u00faa la ejecuci\u00f3n en la sentencia siguiente.<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Sintaxis<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0try{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo del bloque try<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0catch(signatura){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo del bloque catch<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><\/p>\n<p><span style=\"color: #000000;\">Tambi\u00e9n se puede anidar bloques try.<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0void sub(int n) throws Exception<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 try{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 . . .\u00a0 \u00a0 \u00a0 \/\/ bloque try externo<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 try{\u00a0 \u00a0\/\/ bloque try interno<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0. . .<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0if(n==1)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0return ;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 catch(signatura1) {. . .}\u00a0 \u00a0 \u00a0 \u00a0\/\/manejador catch interno<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 catch(signatura2) {. . .}\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ manejador catch externo<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 . . .<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><\/p>\n<p><span style=\"color: #000000;\">Una excepci\u00f3n lanzada en el bloque interior try ejecuta el manejador catch con signatura1 si coincide el tipo de excepci\u00f3n. El manejador catch con signatura2 maneja excepciones lanzadas desde el bloque try exterior si el tipo de la excepci\u00f3n coincide. El manejador externo de catch tambi\u00e9n captura excepciones lanzadas desde el bloque interior si el tipo de excepci\u00f3n coincide con signatura2 pero no con signatura1. Si los tipos de excepci\u00f3n no coinciden con ninguna signatura, la excepci\u00f3n se propaga al llamador de sub().<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Normas<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0try{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sentencias<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0catch(par\u00e1metro){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sentencias<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0catch(par\u00e1metro){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sentencias<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0etc.<\/span><\/p>\n<ol>\n<li><span style=\"color: #000000;\">Cuando una excepci\u00f3n se produce en sentencias del bloque try hay un salto al primer manejador (catch) cuyo par\u00e1metro coincida con el tipo de excepci\u00f3n.<\/span><\/li>\n<li><span style=\"color: #000000;\">Cuando las sentencias en el manejador se han ejecutado, se termina el bloque try y la ejecuci\u00f3n prosigue en la sentencia siguiente. Nunca se produce un salto hacia atr\u00e1s, al lugar en que ocurri\u00f3 la interrupci\u00f3n.<\/span><\/li>\n<li><span style=\"color: #000000;\">Si no hay manejadores para tratar con una excepci\u00f3n, se aborta el bloque try y la excepci\u00f3n se relanza.<\/span><\/li>\n<li><span style=\"color: #000000;\">Si se utiliza el manejador opcional finally, se escribe despu\u00e9s del \u00faltimo catch. La ejecuci\u00f3n del bloque try, se lance o no una excepci\u00f3n, siempre termina con las sentencias de finally.<\/span><\/li>\n<\/ol>\n<h3><span style=\"color: #000000;\"><strong>Precauci\u00f3n<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">Se puede transferir el control fuera de bloques try con una sentencia goto, return, break o continue. Si se ha especificado el manejador finally, primero se ejecuta este y despu\u00e9s transfiere el control.<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">El m\u00e9todo calcularMedia() calcula una media de arreglos de tipo double; para ello invoca al m\u00e9todo avg(). En el caso de ser llamado incorrectamente, avg() lanza excepciones del tipo MediaException.<\/span><\/p>\n<p><span style=\"color: #000000;\">La excepci\u00f3n que se va a lanzar en caso de error, MediaException, debe ser declarada como una clase derivada de Exception:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0class MediaException extends Exception{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0El m\u00e9todo calcularMedia() define un bloque try para tratar excepciones:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0double calcularMedia(int numero){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 double b[] = {1.2 ,2.2, 3.3, 4.4, 5.5, 6.6};<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 double media;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 try{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0media = avg(b,numero);\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00e1lculo media<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0return media;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 catch(MediaException mensaje){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0System.out.println(\u00abExcepcion captada: \u00bb + mensaje);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0System.out.println(\u00abCalcula media: uso de longitud del array \u00ab<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0+ b.length);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0numero = b.length;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0return avg(b,numero);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><\/p>\n<p><span style=\"color: #000000;\">El m\u00e9todo avg() tiene que tener en la cabecera la excepci\u00f3n que puede lanzar:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0double avg(double []p, int n) throws MediaException<\/span><\/p>\n<p><span style=\"color: #000000;\">El m\u00e9todo calcularMedia() define un arreglo de tipo double y llama a avg() con el nombre del arreglo (b) y un argumento de longitud (numero). Un bloque try contiene a avg() para capturar excepciones de tipo MediaException. Si avg lanza la excepci\u00f3n MediaException, el manejador de catch la capta, escribe un mensaje y vuelve a llamar a avg() con un valor predeterminado (la longitud del arreglo b).<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La palabra reservada\u00a0try\u00a0designa un bloque try, que es un \u00e1rea de su programa que detecta excepciones. En el interior de bloques try, normalmente se llaman a m\u00e9todos que pueden levantar o\u00a0lanzar excepciones.\u00a0La palabra reservada catch designa un manejador de capturas con una signatura que representa un tipo de excepci\u00f3n. Los manejadores de captura siguen inmediatamente &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/www.manualjava.net\/?p=2470\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2473,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[],"_links":{"self":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2470"}],"collection":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2470"}],"version-history":[{"count":25,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2470\/revisions"}],"predecessor-version":[{"id":2481,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2470\/revisions\/2481"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/media\/2473"}],"wp:attachment":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2470"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2470"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}