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