Download Manejo de excepciones, una introduccion, leer para
Document related concepts
no text concepts found
Transcript
Excepciones Excepciones Una excepción es una condición anormal que surge en una secuencia de código durante la ejecución. En otras palabras una excepción es un error en tiempo de ejecución. Una excepción Java es un objeto que describe una condición excepcional (esto es, error) que ha ocurrido a un segmento de código. Cuando surge una condición excepcional, se crea un objeto que presenta una excepción y se lanza (throw) en el método que produce el error. Una excepción es un evento que ocurre durante la ejecución de un programa e interrumpe el flujo normal de las instrucciones. El manejo de excepciones se gestiona a través de cinco instrucciones: tyr, catch, throw, throws y finally. try catch finally throw throws Tiene el código de ejecución, si se produce un error lanza (throw) una excepción que será capturada. Captura la excepción lanzada por try que le precede. Puede capturar más de una excepción, es decir que se pueden añadir. La excepción es tratada en un gestor por omisión, es opcional, y cuando se utiliza, se pone después del ultimo catch, y se ejecuta haya ocurrido o no una excepción; éste es ideal para cuando es necesario liberar recursos, o cerrar archivos antes de que cualquier cosa suceda. Permite especificar en un método la lista de excepciones que puede lanzar, que podrán ser capturadas en un bloque try-catch implementado por el mismo método, por otro método de la misma clase o por un método de otra clase de la pila de llamadas. Permite declarar una excepción. Indica las excepciones que puede elevar un método. SINTAXIS DE EXCEPCIONES: try { //bloque de código para monitorizar errores } catch (TipoExcepcion1 e){ //manejador de excepciones para tipoExcepción } catch (TipoExcepcion2 e){ gestión de la excepción; throw(e); } finally{ //bloque de código que se ejecutará antes de terminar el bloque try } Cada tipo de excepción está representada por una subclase de la clase Exception (al final del documento se presenta una lista de clases derivada de esta clase), mientras que los errores son subclases de la Error. Ambas clases. Exception y Error, son subclases de la clase Throwable. Object clase Throwable Exception Error Al producirse una excepción en un programa, se crea un objeto de la subclase Exception a la que pertenece la excepción. Exception RuntimeException IOException … SQLException AritmeticException NullPointerException IndexOutBoundsException : maria eugenia puga nathal Página 1 08/08/2017 Excepciones Tipos de excepciones Marcadas No marcadas Aquellas cuya captura es obligatoria. Normalmente este tipo de excepciones se producen al invocar a ciertos métodos de determinadas clases y son generadas (lanzadas) desde el interior de dichos métodos como consecuencia de algún fallo durante la ejecución de los mismo. Por ejemplo IOException que es lanzada por el método readLine() de la clase BufferedReader cuando se produce un error durante la operación de lectura. Pertenecen a este grupo todas las excepciones de tiempo de ejecución, es decir, la clase RuntimeException y todas sus subclases. Si en un bloque de código se invoca a algún método que puede provocar una excepción marcada y ésta no es capturada, el programa no compilará, e indicará la falta de esta declaración. Para declarar una excepción se utiliza la palabra reservada throws, seguida de la lista de excepciones. Para capturar una excepción será necesario el uso del conjunto try-catch, asociando los catch necesarios de acuerdo a la lista de excepciones a capturar. No es obligatorio capturar dentro de un programa Java una excepción no marcada, debido a que gran parte de ellas se producen por una mala programación, por lo que la solución no es preparar el programa para que sea capaz de recuperarse ante una situación como ésta, si no por evitar que se produzca. Uno de los errrores mas frecuentes es cuando se produce una división ente cero, por ejemplo int k=4/0, se producirá un error, el programa abortará, y se lanzará la excepción ocurrida de la manera siguiente: Java Division Exception int Thread “main” java.lang.ArithmeticException:/by zero at Division.main(Division.java:5) Otro error frecuente es en el manejo de las posiciones de un arreglo, por ejemplo al tratar de accesar a una posición no valida de éste. Ejemplos de otros errores IOException - archivos que se abrieron y no se cerraron conexiones a redes que no se cierran los datos no se escriben en el disco fallo al abrir un archivo llegar al fin del archivo RuntimeException - sobrepasar el límite de un arreglo utilizar una variable de referencia nula división entre cero conversiones de datos –de cadena a valor numérico Desventaja del uso de las excepciones Algunas de las desventajas que se pueden presentar con el uso de las excepciones son: - se puede perder la lógica del programa al añadir código - incrementa el tamaño del código ejecutable Pasos del modelo 1. el programador “intentará” (try) una operación para anticipar errores maria eugenia puga nathal Página 2 08/08/2017 Excepciones 2. 3. cuando una rutina encuentra un error, se “lanza” (throw) una excepción. El lanzamiento (throwing) de una excepción es el acto de levantar una excepción. alguien interesado en una condición de error (para limpieza y/o recuperación) anticipará el error y “capturará” (catch) la excepción que se ha lanzado. Captura de excepciones En el momento que se produce una excepción en un programa, se crea un objeto de la clase excepción correspondiente y se “lanza” a la línea de código donde la excepción tuvo lugar. El mecanismo de captura de excepciones de Java, permite “atrapar” el objeto de excepción lanzado por la instrucción e indicar las diferentes acciones a realizar según la clase de excepción producida. A diferencia de las excepciones, los errores representan fallos de sistema de los cuales el programa no se puede recuperar. Para la captura o “atrapar” una excepción, como ya se mencionó, se hace uso de try y catch, en try se pone el código propenso a posibles fallos, en el catch se indica el tipo de excepción a capturar y se escribe el código necesario para tratar de aminorar el problema generado. Un try puede tener varios catch, pero un catch no puede tener varios try. Por lo generar se recomienda, poner los catch que sean necesarios y al final poner un catch con la clase Exception, la cual se encargará de capturar alguna otra excepción que se produzca y no haya sido considerara en los catch anteriores. Estructura correcta try{ --------} catch(IOException e) {----} catch(Exception e) {----} Estructura incorrecta debido a que la clase IOException es una clase derivada de la clase genérica Exception, por lo que si se lanza una excepción, ésta siempre será captura por el catch que contiene a la clase Exception y no a los mas específicos ,ya que nunca se ejecutarán. try{ --------} catch(Exception e) {----} catch(IOException e) {----} Propagación de excepciones Si se produce una excepción no marcada para la que se ha definido un bloque catch, ésta será propagada por la pila de llamadas hasta encontrar algún punto en el que se trate la excepción. De no existir un tratamiento para la misma, la JVM abortará la ejecución del programa y enviará un volcado de pila a la consola. Se utiliza la instrucción throw para lanzar una excepción. También desde el catch se puede lanzar una excepción: catch(IOException e) {throw e;} Ejemplos: class Cuenta {private double saldo; public Cuenta() {saldo=0;} public void ingresar(double x) {saldo=saldo+x;} public void extraer(double x) throws Exception {if (saldo<x) {// crea y lanza una excepcion throw new Exception(); maria eugenia puga nathal Página 3 08/08/2017 Excepciones } else saldo=saldo-x; } public double getSaldo() {return saldo;} } grabar Cuenta.java public class Cajero {public static void main(String arg[]) {Cuenta c=new Cuenta(); try{ c.ingresar(100); c.extraer(120); System.out.println(c.getSaldo()); } catch(Exception e) {System.out.println("la cuenta no puede quedar en numeros rojos");} } } grabar Cajero.java Si en el método main() también se pone throws en lugar de try, al generarse la excepción se propaga y como no hay métodos intermedios que la capturen, llega éste y como es el último método, se propaga hasta la JVM y se genera una interrupción del programa (aborta), indicando lo siguiente: ÏException in thread "main" java.lang.Exception at Cuenta.extraer(Cajero.java:23) at Cajero.main(Cajero.java:6) public class propagacion {public static void main(String arg[]) throws Exception { propagacion p=new propagacion(); try{ p.a(); } catch(Exception e) {System.out.println("aqui se captura la excepcion lanada por el metodo d()");} } void a() throws Exception {b();} void b() throws Exception {c();} void c() throws Exception {d();} void d() throws Exception {while(true) {if ((int)(Math.random()*10)==5) {System.out.println("se lanzo una excepcion"); throw new Exception(); } else System.out.println("aun no falla"); } } } grabar propagacion Al igual que en el ejemplo anterior, maria eugenia puga nathal Página 4 08/08/2017 Excepciones El problema se genero en el método d() como no se está utilizando el try para la captura de la excepción generada, la excepción se propaga al método c(), ya que éste invocó a d(), pero como también maneja la excepción con el throws, no se captura ésta y el problema se propaga al método b(), debido que éste a su vez invocó a c(), al igual que los anteriores, la excepción es lanzada con el throws, por lo que problema llega al método a(), ya que éste invocó al b(); y al igual que los anteriores la excepción es manejada con el throws, por lo que se propaga al método main() quien a su vez invoco al método a(), pero como en este método la excepción si es capturada (se hizo uso del try-catch), se evita la interrupción de manera anormal del programa. Si en este último la excepcion también se hubiera lanzado con el throws en lugar del try, aborta el programa e indicaría el mensaje siguiente: Exception in thread "main" java.lang.Exception at propagacion.d(propagacion.java:20) at propagacion.c(propagacion.java:15) at propagacion.b(propagacion.java:13) at propagacion.a(propagacion.java:11) at propagacion.main(propagacion.java:5) Diseño de una excepción Definir la clase que contendrá nuestra excepción, la cual heredará de la clase genérica Exception class MiExcepcion extends Exception {MiExcepcion (String msg) {super(msg); //constructor de la clase } public String mensaje() { return super.getMessage(); } } Se diseña la clase que contendrá el método que lanzará la excepción (causa por la que se puede lanzar) class LanzoMiExcepcion {// este metodo contiene la decisión que debe de cumplirse para que se lance la excepcion, en otras palabras, aquí // indicamos que debe de suceder para que se de un error, una aplicación pudiera ser que generáramos rutinas de // validación de datos y si no cumple el formato que se lance la excepcion public char metodo(char x) throws MiExcepcion {if ((x<='A' || x>='Z')&&(x<='a' || x>='z')) throw new MiExcepcion("No es letra"); return Character.toUpperCase(x); } } En esta clase se hace la aplicación en la cual en un momento dado pudiera generarse la excepción que diseñamos. import java.io.*; public class Prueba {public static void main(String arf[])throws IOException, MiExcepcion {char c; LanzoMiExcepcion obj=new LanzoMiExcepcion(); System.out.print("proporciona un caracter "); c=(char)System.in.read(); try{ System.in.skip(System.in.available()); System.out.println(c+""+obj.metodo(c)); } maria eugenia puga nathal Página 5 08/08/2017 Excepciones catch(MiExcepcion e) {System.out.println(e.mensaje());} } AclNotFoundException ActivationException AlreadyBoundException ApplicationException AWTException BackingStoreException BadAttributeValueExpException BadBinaryOpValueExpException BadLocationException BadStringOperationException BrokenBarrierException CertificateException ClassNotFoundException CloneNotSupportedException DataFormatException DatatypeConfigurationException DestroyFailedException ExecutionException ExpandVetoException FontFormatException InvalidTargetObjectTypeException InvocationTargetException IOException JAXBException JMException KeySelectorException LastOwnerException LineUnavailableException MarshalException MidiUnavailableException MimeTypeParseException MimeTypeParseException NamingException NoninvertibleTransformException NoSuchFieldException NoSuchMethodException NotBoundException NotOwnerException ParseException ParserConfigurationException SOAPException, SQLException, TimeoutException, TooManyListenersException, TransformerException, TransformException, UnmodifiableClassException, UnsupportedAudioFileException, UnsupportedCallbackException, UnsupportedFlavorException, UnsupportedLookAndFeelException, URIReferenceException, URISyntaxException, UserException, XAException, XMLParseException, XMLSignatureException, XMLStreamException, XPathException } maria eugenia puga nathal Página 6 08/08/2017 Excepciones GeneralSecurityException GSSException IllegalAccessException IllegalClassFormatException InstantiationException InterruptedException IntrospectionException InvalidApplicationException InvalidMidiDataException InvalidPreferencesFormatException PrinterException PrintException PrivilegedActionException PropertyVetoException RefreshFailedException RemarshalException RuntimeException SAXException ScriptException ServerNotActiveException, Subclases de la clase Exception Subclases de la clase RuntimeException AnnotationTypeMismatchException ArithmeticException ArrayStoreException BufferOverflowException BufferUnderflowException CannotRedoException CannotUndoException ClassCastException CMMException ConcurrentModificationException DOMException EmptyStackException EnumConstantNotPresentException EventException IllegalArgumentException IllegalMonitorStateException, IllegalPathStateException IllegalStateException ImagingOpException IncompleteAnnotationException IndexOutOfBoundsException JMRuntimeException LSException MalformedParameterizedTypeException MirroredTypeException MirroredTypesException MissingResourceException NegativeArraySizeException NoSuchElementException NoSuchMechanismException NullPointerException ProfileDataException ProviderException RasterFormatException RejectedExecutionException SecurityException SystemException TypeConstraintException TypeNotPresentException UndeclaredThrowableException UnknownAnnotationValueException UnknownElementException UnknownTypeException UnmodifiableSetException UnsupportedOperationException, WebServiceException InterruptedIOException InvalidPropertiesFormatException JMXProviderException JMXServerErrorException MalformedURLException ObjectStreamException ProtocolException RemoteException SaslException SocketException SSLException, SyncFailedException, UnknownHostException, UnknownServiceException, UnsupportedDataTypeException, UnsupportedEncodingException, UTFDataFormatException, ZipException Subclases de la clase IOException ChangedCharSetException CharacterCodingException CharConversionException ClosedChannelException EOFException FileLockInterruptionException FileNotFoundException FilerException HttpRetryException IIOException maria eugenia puga nathal Página 7 08/08/2017