10.07.2015 Views

Manejo de excepciones en Java

Manejo de excepciones en Java

Manejo de excepciones en Java

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

V<strong>en</strong>tajas <strong>de</strong> usar <strong>excepciones</strong>: Separarcódigo normal <strong>de</strong> casos <strong>de</strong> errorSupongamos que queremos leer un archivocompleto a memoria:readFile {}abrir un archivo;<strong>de</strong>terminar su tamaño;localizar esa cantidad <strong>de</strong> memoria;leer el archivo <strong>en</strong> memoria;cerrar el archivo;


V<strong>en</strong>tajas <strong>de</strong> usar <strong>excepciones</strong>:Separar código <strong>de</strong> casos <strong>de</strong> error Sin <strong>excepciones</strong> <strong>de</strong>bemos hacer algo así:errorCo<strong>de</strong>Type readFile {initialize errorCo<strong>de</strong> = 0;Abrir el archivo;if (theFileIsOp<strong>en</strong>) {Determinar el largo <strong>de</strong>l archivo;if (gotTheFileL<strong>en</strong>gth) {Localizar esa cantidad <strong>de</strong> memoria;if (gotEnoughMemory) {Leer el archivo <strong>en</strong> memoria;if (readFailed) {errorCo<strong>de</strong> = -1;}} else {errorCo<strong>de</strong> = -2;}} else {errorCo<strong>de</strong> = -3;}Cerrar el archivo;if (theFileDidntClose && errorCo<strong>de</strong> == 0) {errorCo<strong>de</strong> = -4;} else {errorCo<strong>de</strong> = errorCo<strong>de</strong> and -4;}} else {errorCo<strong>de</strong> = -5;}return errorCo<strong>de</strong>;}


www.it-production.comPREMIUM-ACCOUNTMit einem Premium-Account auf it-production.com int<strong>en</strong>sivier<strong>en</strong> Sie Ihre Zielgrupp<strong>en</strong>-Anspracheund heb<strong>en</strong> die Leistung<strong>en</strong> Ihres Unternehm<strong>en</strong>s <strong>de</strong>utlich hervor. Nachfolg<strong>en</strong>d erhalt<strong>en</strong> Sie ein<strong>en</strong>Überblick über die Leistung<strong>en</strong> eines Premium-Accounts.Account-Leistung<strong>en</strong> im ÜberblickWebcast: Einbindung eines Firm<strong>en</strong>-Vi<strong>de</strong>os in die <strong>en</strong>tsprech<strong>en</strong><strong>de</strong> Them<strong>en</strong>rubrikStandard-Eintrag in die "Marktübersicht<strong>en</strong>"✓✓+ Firm<strong>en</strong>logo ✓+ Digitales Produktportrait (Text ca. 5.000 Zeich<strong>en</strong> + Bil<strong>de</strong>r) ✓Standard-Eintrag in <strong>de</strong>n "Veranstaltungskal<strong>en</strong><strong>de</strong>r"✓+ Firm<strong>en</strong>- o<strong>de</strong>r Veranstaltungslogo ✓Eintrag in Rubrik "Messeauftritte" + Firm<strong>en</strong>logoEintrag in <strong>de</strong>n "Stell<strong>en</strong>markt"✓✓+ Individuelle Formatierung ✓+ Firm<strong>en</strong>logo ✓Veröff<strong>en</strong>tlichung Ihrer "Whitepapers"Rubrik „Anbieter IT+Software“: Einbindung eines digital<strong>en</strong> Produktportraits✓✓Preise*Laufzeit6 Monate € 2.550,-12 Monate € 3.900,-*Alle Preise versteh<strong>en</strong> sich zzgl. <strong>de</strong>r gesetzlich<strong>en</strong> MwSt.8


<strong>Manejo</strong> <strong>de</strong> Excepciones:Ejemplos try {// código} catch (StackError e ){// código que se hace cargo <strong>de</strong>l error reportado <strong>en</strong> e}El bloque try pue<strong>de</strong> manejar múltiples <strong>excepciones</strong>:try {// código} catch (StackError e ){// código para manejar el error <strong>de</strong> stack} catch (MathError me){// código para manejar el error matemático indicado <strong>en</strong> me.}


Captura <strong>de</strong> Excepciones: Ejemplo 1 public static void doio (InputStream in, OutputStream out) {int c;try { while (( c=in.read()) >=0 ){ c= Character.toLowerCase( (char) c);out.write( c );}} catch ( IOException e ) {System.err.println(“doio: I/O Problem”);System.exit(1);}}


Captura <strong>de</strong> Excepciones: Ejemplo 2 ......try { FileInputStream infile = new FileInputStream(argv[0]);File tmp_file = new File(tmp_name);....} catch (FileNotFoundException e) {System.err.println(“Can´t op<strong>en</strong> input file “+ argv[0]);error = true;} catch (IOException e ) {System.err.println(“Can´t op<strong>en</strong> temporary file “+tmp_name);error = true;}finally {if ( infile != null) infile.close();if (tmp_file != null) tmp_file.close();if (error) System.exit();}El código <strong>de</strong> la sección finally es ejecutado no importando si el bloquetry terminó normalm<strong>en</strong>te, por excepción, por return, o break.


Tipos <strong>de</strong> ExcepcionesLas hay <strong>de</strong> dos tiposAquellas g<strong>en</strong>eradas por el l<strong>en</strong>guaje <strong>Java</strong>. Éstas seg<strong>en</strong>eran cuando hay errores <strong>de</strong> ejecución, como altratar <strong>de</strong> acce<strong>de</strong>r a métodos <strong>de</strong> una refer<strong>en</strong>cia noasignada a un objeto, división por cero, etc.Aquellas no g<strong>en</strong>eradas por el l<strong>en</strong>guaje, sinoincluidas por el programador.El compilador chequea por la captura <strong>de</strong> las<strong>excepciones</strong> lanzadas por los objetos usados <strong>en</strong> elcódigo.Si una excepción no es capturada, <strong>de</strong>be serrelanzada.


Re<strong>en</strong>viando Excepcionespublic static void doio (InputStream in, OutputStream out)throws IOException // <strong>en</strong> caso <strong>de</strong> más <strong>de</strong> una excepción throws exp1, exp2{}int c;while (( c=in.read()) >=0 ){c= Character.toLowerCase( (char) c);out.write( c );}Alternativam<strong>en</strong>te: public static void doio (InputStream in, OutputStream out) throws Throwable {int c;try { while (( c=in.read()) >=0 )En este caso el método{ c= Character.toLowerCase( (char) c); <strong>en</strong>vía una excepción - queout.write( c );aquí correspon<strong>de</strong> al mismo}objeto capturado -por lo} catch ( Throwable t ) {tanto <strong>de</strong>be <strong>de</strong>clarase <strong>en</strong> lathrow t;cláusula throws.}}Si la excepción no escapturada, <strong>de</strong>be serre<strong>en</strong>viada!!! Si el método usa la cláusula throw <strong>de</strong>be indicarlo <strong>en</strong> su <strong>de</strong>claración con lacláusula throws.


Creación <strong>de</strong> tus propias <strong>excepciones</strong>Siempre es posible lanzar alguna excepción <strong>de</strong> las ya <strong>de</strong>finidas <strong>en</strong> <strong>Java</strong>(IOException por ejemplo).También se pue<strong>de</strong> <strong>de</strong>finir nuevas <strong>excepciones</strong> creando clases <strong>de</strong>rivadas <strong>de</strong> lasclases Error o Exception.class ZeroD<strong>en</strong>ominatorException ext<strong>en</strong>ds Exception{ private int n;public ZeroD<strong>en</strong>ominadorException () {}public ZeroD<strong>en</strong>ominadorException(String s) {super(s);}public setNumerator(int _n) { n = _n}// otros métodos <strong>de</strong> interés}Luego la po<strong>de</strong>mos usar como <strong>en</strong>:....public Fraction (int n, int d) throws ZeroD<strong>en</strong>ominatorException {if (d == 0) {ZeroD<strong>en</strong>ominatorException myExc = newZeroD<strong>en</strong>ominatorExceptio(“Fraction: Fraction with 0 <strong>de</strong>nominator?”);myExc.setNumerator(n);throw (myExc);....}


Creación <strong>de</strong> tus propias <strong>excepciones</strong>class ProbabilidadException ext<strong>en</strong>ds Exception{private float p;public ProbabilidadException(float p, String s){super(s);this.p=p;}public float getProbabilidad() { return p;}}public class myclass{public void setProbabilidad (float nueva_p)throwsProbabilidadException {if (nueva_p > 1.0) {throw(new ProbabilidadException(nueva_p,"Probabilidad Mayorque uno"));}probabilidad = nueva_p;}// .... otras <strong>de</strong>claraciones....private float probabilidad;}


Jerarquía <strong>de</strong> Excepciones<strong>Java</strong> prohíbe crear subclases <strong>de</strong> Throwable.Cuando creemos nuestras <strong>excepciones</strong>, seránsubclases <strong>de</strong> Exception. (mostrar tutorial <strong>de</strong> Sun)<strong>Java</strong> no obliga a manejar o re<strong>en</strong>viarRuntimeException.


Cuándo no po<strong>de</strong>mos relanzar unaexcepciónHay situaciones <strong>en</strong> que estamos obligados a manejar una excepción. Consi<strong>de</strong>remospor ejemplo:class MyApplet ext<strong>en</strong>ds Applet {public void paint (Graphics g) {FileInputStream in = new FileInputStream(“input.dat”); //ERROR....}}Se crea aquí un problema porque la int<strong>en</strong>ción es re<strong>de</strong>finir un método <strong>de</strong> la claseApplet - método paint- el cual no g<strong>en</strong>era ninguna excepción. Si un método no g<strong>en</strong>era<strong>excepciones</strong> la función que lo re<strong>de</strong>fine no pue<strong>de</strong> lanzar <strong>excepciones</strong> (problema <strong>en</strong><strong>Java</strong>).Lo previo obliga a que <strong>de</strong>bamos hacernos cargos <strong>de</strong> la excepción.class MyApplet ext<strong>en</strong>ds Applet {public void paint (Graphics g) {try {FileInputStream in = new FileInputStream(“input.dat”); //ERROR....} catch (Exception e) {//......}}


Cosas a tomar <strong>en</strong> cu<strong>en</strong>taLas <strong>excepciones</strong> consum<strong>en</strong> tiempo, no usarlascuando hay alternativas mejores, ejemploExceptionTest.javaAgrupar el manejo <strong>de</strong> varias <strong>excepciones</strong> <strong>en</strong> un únicotry…En cada caso evaluar si es mejor atrapar la excepcióno re<strong>en</strong>viarla a código llamador.Ejemplo:public void readStuff(String name) Throws IOException{FileInputStream in= new FileInputStream(name);….}El código que llama al método pue<strong>de</strong> manejar <strong>de</strong> mejor formala excepción que aquí.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!