Sesión 9. TEMA 11 Clases abstractas. Manejo de errores y ...Introducci´on Clases abstractas...

Post on 08-Mar-2021

7 views 0 download

Transcript of Sesión 9. TEMA 11 Clases abstractas. Manejo de errores y ...Introducci´on Clases abstractas...

Introduccion Clases abstractas Errores y excepciones Cuestiones

Sesion 9. TEMA 11 Clases abstractas. Manejo deerrores y excepciones

Fundamentos de Informatica

Jose Jaime Noguera Noguera

28 de abril de 2020

Introduccion Clases abstractas Errores y excepciones Cuestiones

Contenidos

1 Introduccion

2 Clases abstractas

3 Errores y excepciones

4 Cuestiones

Introduccion Clases abstractas Errores y excepciones Cuestiones

Temario

Este Tema tiene dos partes. La primera corresponde a clases abs-tractas (apartados 10.3 y 10.4 de la edicion 5, o 12.3 y 12.4 de laedicion 6). Las secciones del libro tratan sobre unas clases que seexplican en apartados que no entran, con lo cual es complicado se-guir los razonamientos. Lo importante es centrarse en los conceptosclase abstracta y metodo abstracto.

La segunda parte del tema hace referencia al manejo de errores yexcepciones (tema 12 del libro en la edicion 5 o tema 14 en la edicion6.)

Introduccion Clases abstractas Errores y excepciones Cuestiones

Clase abstracta

Una clase abstracta es una clase de la cual no se van a crear ins-tancias, es decir no tendremos objetos de dicha clase. Su objetivoes ser superclase de otras subclases. Debemos tener en cuenta:

Para declarar una clase como abstracta se debe incluirabstract antes de class, por ejemplo public abstract classNombreClaseNo se pueden crear instancias de una clase abstracta. Siutilizamos new NombreClase() nos dara un error.una clase abstracta puede contener metodos abstractos (losexplicamos despues) y tambien metodos no abstractos (oconcretos).Si una clase contiene metodos abstractos necesariamente debeser abstracta.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Metodos abstractos

Se definen como

abstract public/protected TipoRetorno nombreMetodo(listade parametros);

CaracterısticasEstan formados unicamente por una cabecera de un metodo,sin que exista cuerpo. Terminan en punto y coma.Solo pueden existir dentro de una clase abstracta,Estan pensados para que sean sustituidos e implementados enlas subclases. Si esto no se hace la subclase deberanecesariamente ser declarada como abstracta.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Metodos y clases abstratas

Nota 1Su nombre proviene de una mala traduccion al espanol, ya que eningles abstract es resumen y es esto lo que realmente se deberıaentender. Las clases abstract son una clase resumen para sussubclases.

Nota 2Tanto en la definicion de clase abstracta como de metodoabstracto el modificador de acceso (public) y la palabra reservadaabstract pueden intercambiarse. El orden mostrado anteriormentees una cuestion de estilo.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Ejemplo

Retomando el ejemplo de la sesion anterior podemos hacer las si-guientes modificaciones para incluir clases y metodos abstractos(descargar codigo):

Definir Vehıculo como clase abstracta, entendiendo ası que enel taller solo podemos crear objetos de tipo Coches o Motospero no vehıculos; public abstract class VehiculoDefinir como abstracto el metodo mostrarInfo(): abstractpublic void mostrarInfo();Completar el metodo ya implementado mostrarInfo() de lassubclases para que imprima la marca y la matrıcula.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Diagrama de clases

Observar que BlueJ nos informa de que las clases son abstractascon el identificador «abstract». Ademas cuando creamos una clasenueva nos permite elegir la opcion de clase abstracta.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Tratamiento de errores y excepciones

Este tema es bastante confuso ya que al ser muy extenso se danindicaciones imprecisas del tipo: esto no es una ciencia exacta oesto no lo explicamos porque excede los objetivos de este libro, ...Ademas la forma de explicarlo difiere segun el tutorial o libro queleas. Para aumentar los problemas has de tener en cuenta:

A lo largo del tema aparecen conceptos que no has estudia-do (ya que hemos saltado temas y secciones): TreeMap, List,SortedMap, interfaces...

Por tanto, la recomendacion es centrarse en entender los conceptosgenerales que pueden aparecer en el test y no pretender entendertodo el tema al detalle.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Objeto cliente y objeto servidor

La nomenclatura de objeto cliente y objeto servidor hace referenciaa lo siguiente:

Objeto servidor: es un objeto cualquiera que dispone demetodos en el codigo de la clase a partir de la cual ha sidoinstanciado.Objeto cliente: es un objeto que hace uso de un metodo delobjeto servidor. Es decir, dentro del objeto cliente se llama aun metodo del objeto servidor (mediante notacion de punto).

Introduccion Clases abstractas Errores y excepciones Cuestiones

Errores y excepciones

Un error o excepcion se produce cuando al compilar o ejecutar unprograma se llega a una situacion en que Java no sabe como actuar.Por ejemplo, se divide por 0, o se intenta abrir un fichero que no exis-te... Ante estas situaciones cabe preguntarse quien es el responsablede este error y quien debe resolverlo. Imaginemos un objeto clien-te que intenta ejecutar un metodo con un String que en realidadrequerıa un int:

¿Deberıa haberse previsto estas situaciones desde el objetoservidor y haber introducido codigo para evitarlo?(programacion defensiva)¿Deberıa el cliente haber evitado el error siendo ”consciente”del tipo de parametro necesario?

Introduccion Clases abstractas Errores y excepciones Cuestiones

Errores y excepciones

Hay diversas maneras de tratar estos problemas:Informar al usuario de que se ha producido un error (¿y si elusuario no es un humano o no entiende lo que se le dice?).Devolver valores booleanos para asegurarnos de que unmetodo ha realizado su cometido.Devolver valores null en vez de objetos en metodos tipo get.

Sin embargo estas medidas son normalmente insuficientes y Javadispone de mecanismos mas eficientes: la generacion de objetos es-pecıficos que informen del error.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Errores y excepciones

Cuando a un objeto servidor, un cliente le solicita ejecutar uno de susmetodos, pero el primero no puede terminar la llamada del segundo,entonces el objeto servidor puede generar un objeto excepcion:

El objeto excepcion representa los detalles del fallo de unprograma.El error lo descubre el objeto servidor y genera el objetoexcepcion.La recuperacion del error, en caso de intentarlo, se realiza enel cliente, ya que si el servidor puede por sı mismo recuperarsedel error, no tiene sentido crear el objeto excepcion.El objeto excepcion es una instancia de una clase de lajerarquıa de clases Throwable.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Jerarquıa de clases

Introduccion Clases abstractas Errores y excepciones Cuestiones

Jerarquıa de clases

Error: problema grave que no debemos tratar de solucionar:OutOfMemoryError (memoria agotada), InternalError (errorde la JVM)...Exception: excepciones que podrıan evitarse o tratarse. Sedividen en:

RuntimeException y sus subclases: Excepciones NOCOMPROBADAS (unchecked).El resto de subclases de Exception: excepcionesCOMPROBADAS (checked).

Introduccion Clases abstractas Errores y excepciones Cuestiones

Excepciones comprobadas y no comprobadas

COMPROBADAS: situaciones en el que el objeto cliente de-berıa esperar que una operacion pueda fallar y debe comprobarsi esta ha tenido exito. Deben utilizarse para situaciones que nopuede evitar el programador, como problemas de entrada/sa-lida: FileNotFoundException, ZipException, MalformedURLEx-ception ...NO COMPROBADAS: situaciones en que el objeto cliente nun-ca deberıa esperar que fallasen y por tanto no necesita com-probar si las operaciones han tenido exito. Corresponden a fa-llos que comete el programador: NullPointerException, ArrayIn-dexOutOfBoundsException, ArithmeticException, NoSuchEle-mentException, ClassCastException...

Aquı hay una lista mas amplia.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Lanzando excepciones

Vamos a ver un ejemplo extremadamente sencillo para ilustrar quesignifica lanzar una excepcion:

Tenemos una clase Servidor y una clase Cliente.En la clase Servidor hay un metodo que si recibe unparametro nulo lanza una excepcion.Crearemos un objeto tipo Servidor y uno Tipo Cliente.Desde el objeto cliente llamaremos al metodo del objetoservidor con parametro nulo y se producira una excepcion.

A continuacion mostramos el codigo. Prestar atencion a como selanza una excepcion:

throw new TipoExcepcion(”Cadena opcional que da informaciondel error”);

Introduccion Clases abstractas Errores y excepciones Cuestiones

Ejemplo: diagrama de clases

Introduccion Clases abstractas Errores y excepciones Cuestiones

Ejemplo: clase Servidor

Introduccion Clases abstractas Errores y excepciones Cuestiones

Ejemplo: clase Cliente

Introduccion Clases abstractas Errores y excepciones Cuestiones

Ejemplo: clase Lanzador

Introduccion Clases abstractas Errores y excepciones Cuestiones

Ejemplo: ejecucion

Al ejecutar el Lanzador se lanza una excepcion (se crea un objeto tipoexcepcion) y el programa finaliza en esa lınea de codigo. Observarlas informaciones que ofrece el terminal y el editor de BlueJ:

Introduccion Clases abstractas Errores y excepciones Cuestiones

Ejemplo: impidiendo crear objetos

En el constructor tambien podemos lanzar excepciones, evitandoası que se creen objetos con estados iniciales invalidos. Por ejemplomodificamos nuestro constructor de la siguiente manera:

Introduccion Clases abstractas Errores y excepciones Cuestiones

Ejemplo: ejecucion

Si ejecutamos el lanzador con la instruccion:

Servidor objetoServidor=new Servidor(”casa”);

obtenemos:

Introduccion Clases abstractas Errores y excepciones Cuestiones

Ejemplo: excepciones no comprobadas

Las anteriores excepciones son no comprobadas, ya que pueden sersolucionadas modificando el codigo, es decir el programador puedeevitarlas. Este tipo de excepciones no requieren ninguna compro-bacion por parte del compilador. La ejecucion se detiene y es elprogramador el que debe solucionar el problema. Otro ejemplo deeste tipo de excepciones serıa por ejemplo la que se produce en elsiguiente metodo que anadimos a nuestra clase Cliente:

Introduccion Clases abstractas Errores y excepciones Cuestiones

Ejemplo: excepciones no comprobadas

Introduccion Clases abstractas Errores y excepciones Cuestiones

Ejemplo: ejecucion

Ejecutamos el Lanzador anadiendo la instruccion:

objetoCliente.excepcionNoComprobada();

Observar que es ahora la division la que lanzara una excepcion tipoArithmeticException y la ejecucion finaliza.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Excepciones comprobadas

Todo lo que veamos ahora para excepciones comprobadas es igual-mente valido para excepciones no comprobadas. Sin embargo el tra-tamiento de excepciones solo es obligatorio con las comprobadas,cuyo uso requiere comprobaciones adicionales por parte del compi-lador. En concreto clausulas throw e instrucciones try. Siguiendo elestilo del libro, no utilizaremosthrow y try en las no comprobadas(aunque puede hacerse).En parte esto es logico, ya que si la excepcion es no comprobada,es el programador el que debe mejorar el codigo, mientras que si escomprobada es fruto de algo que escapa al control del programador.Las clausulas throw y try le indican a Java que hacer en dichoscasos.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Excepciones comprobadas

Tenemos dos opciones para excepciones comprobadas:Relanzarla mediante la clausula throws: en este caso desdeel metodo cliente se propaga la excepcion al metodo que hallamado a este ultimo. Si en el metodo al que se ha propagadola excepcion no hay una rutina que la trate se repite el proceso.Si se llega al metodo inicial que ha llamado a todos los demasy no se trata la excepcion, la ejecucion de detieneCapturarla mediante las instrucciones try/catch. Es la masinteresante y la que deberıamos utilizar, ya que se evita la in-terrupcion de la ejecucion.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Excepciones comprobadas: relanzarla

El metodo leeArchivo() tiene como finalidad leer un archivo llamadoarchivo.txt. Si no se encuentra se produce una excepcion y en estecaso se relanza:

Introduccion Clases abstractas Errores y excepciones Cuestiones

Excepciones comprobadas: relanzarla

Si ejecutamos el codigo (creando un objeto y ejecutando el metodo)obtenemos que la ejecucion se para, ya que la excepcion se relanza.En este caso, dado que el metodo que lo ha llamado (main) tampocotiene una rutina para tratar la excepcion, entonces se detiene.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Excepciones comprobadas: capturarla

Veamos ahora una nueva version que captura la excepcion:

Introduccion Clases abstractas Errores y excepciones Cuestiones

Excepciones Comprobadas: capturarla

En este caso en el bloque try se genera una excepcion, entoncesla ejecucion pasa al boque catch. Observar que la ejecucion no sedetiene, es decir, conseguimos recuperarnos del error.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Excepciones Comprobadas: capturarla

El objeto excepcion que se ha creado, dado que es de tipo IOExcep-tion ha sido capturado en la variable e (este es el nombre del objeto,se puede utilizar cualquier nombre). Como todo objeto tendra unaserie de metodos definidos en la clase IOException (o heredados desus superclases). Los mas utilizados son:

getMessage(): devuelve un mensage detallado sobre laexcepcion que ha ocurrido.printStackTrace(): devuelve la traza de la pila de llamadashasta llegar al error.

Aquı puedes ver mas metodos o bien en la documentacion de la claseException.

Introduccion Clases abstractas Errores y excepciones Cuestiones

try/catch

try{se ejecuta primero

}catch(TipoExcepcion nombre){

se ejecuta si hay una excepcion en el bloque try}finally{

se ejecuta siempre}

Podemos poner uno, varios o ningun catch (pero debeaparecer finally).finally es opcional (siempre que este el catch).Se pueden anidar varios try/catch/finally

Introduccion Clases abstractas Errores y excepciones Cuestiones

Captura de varias excepciones

try{se ejecuta primero

}catch(TipoExcepcion1 nombre1){se ejecuta si hay una excepcion en el bloque try y la

excepcion es de tipo TipoExcepcion1}catch(TipoExcepcion2 nombre2){

se ejecuta si hay una excepcion en el bloque try, laexcpecion no es de tipo TipoExcepcion1 pero es detipo TipoExcepcion2

}

Si TipoExcepcion1 fuese superclase de TipoExcepcion2, el segundocatch nunca se ejecutarıa ya que la excepcion se capturarıa (en casode hacerlo) en el primero. Las superclases siempre deben situarsedespues de sus subclases.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Multicaptura

En Java 7 se permite gestionar multiples excepciones en un solocatch:

try{se ejecuta primero

}catch(TipoExcepcion1 | TipoExcepcion2 nombre1){se ejecuta si hay una excepcion en el bloque try y la

excepcion es de tipo TipoExcepcion1 o TipoExcepcion2}

Introduccion Clases abstractas Errores y excepciones Cuestiones

try con recursos

En Java 7 se permite una nueva estructura utilizada principalmentepara cerrar archivos automaticamente una vez completada la ins-truccion try :

try(FileWriter wrtiter=new FileWriter(filename)){se ejecuta primero y no es necesario poner una

instruccion writer.close()}catch(IOException e){

se ejecuta si hay una excepcion en el bloque try y laexcepcion es de tipo IOException

}

En este caso podemos no poner el catch.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Definicion de nuevas clases de excepcion

Podemos definir nuestras propias clases de excepcion, creando sub-clases de la clase Exception:

public class MiExcepcion extends Exception{...

}

A partir de esta subclase podemos lanzar y capturar excepcionestipo MiExcepcion.Aparte de los ejemplos del libro, si quieres ver otros (ademas de serun buen repaso de todo lo visto): excepciones1, excepciones2

Introduccion Clases abstractas Errores y excepciones Cuestiones

Pregunta

¿Es correcto lo siguiente?

abstract public class Clase(){...

}

Introduccion Clases abstractas Errores y excepciones Cuestiones

Respuesta

¿Es correcto lo siguiente?

abstract public class Clase(){...}

Sı es correcto. Es el constructor de una clase abstracta. El orden deabstract y public no importa.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Pregunta

¿Es correcto lo siguiente?

abstract public void metodo(){...

}

Introduccion Clases abstractas Errores y excepciones Cuestiones

Respuesta

¿Es correcto lo siguiente?

abstract public void metodo(){...}

No, un metodo abstracto no tiene cuerpo y acaba en ; tras el ().

Introduccion Clases abstractas Errores y excepciones Cuestiones

Pregunta

¿Podemos definir un metodo abstracto en cualquier clase?

Introduccion Clases abstractas Errores y excepciones Cuestiones

Respuesta

¿Podemos definir un metodo abstracto en cualquier clase?

No, necesariamente debe estar declarado en una clase abstracta.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Pregunta

¿Podemos definir un metodo no abstracto en una clase abstracta?

Introduccion Clases abstractas Errores y excepciones Cuestiones

Respuesta

¿Podemos definir un metodo no abstracto en una clase abstracta?

Sı, no hay ningun problema.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Pregunta

¿Podemos definir una clase abstracta sin metodos abstractos?

Introduccion Clases abstractas Errores y excepciones Cuestiones

Respuesta

¿Podemos definir una clase abstracta sin metodos abstractos?

Sı, no hay ningun problema.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Pregunta

¿Se puede utilizar un try/catch en excepciones no comprobadas?

Introduccion Clases abstractas Errores y excepciones Cuestiones

Respuesta

¿Se puede utilizar un try/catch en excepciones no comprobadas?

Sı, aunque Java no lo requiere.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Pregunta

Si las unicas lineas para mostrar algo por pantalla son las que apare-cen aquı y sabiendo que en el bloque de sentencias 1 no se produceninguna excepcion, ¿Que se muestra por pantalla?

try{bloque de sentencias 1System.out.print("hola");

}catch(TipoExcepcion e){bloque de sentencias 2System.out.print("adios");

}System.out.print("fin");

Introduccion Clases abstractas Errores y excepciones Cuestiones

Respuesta

Si las unicas lineas para mostrar algo por pantalla son las que apare-cen aquı y sabiendo que en el bloque de sentencias 1 no se produceninguna excepcion, ¿Que se muestra por pantalla?

try{bloque de sentencias 1System.out.print("hola");

}catch(TipoExcepcion e){bloque de sentencias 2System.out.print("adios");

}System.out.print("fin");

Se muestra: holafin

Introduccion Clases abstractas Errores y excepciones Cuestiones

Pregunta

Si las unicas lineas para mostrar algo por pantalla son las que apare-cen aquı y sabiendo que en el bloque de sentencias 1 se produce unaexcepcion que no es subtipo de TipoExcepcion, ¿Que se muestra porpantalla?

try{bloque de sentencias 1System.out.print("hola");

}catch(TipoExcepcion e){bloque de sentencias 2System.out.print("adios");

}System.out.print("fin");

Introduccion Clases abstractas Errores y excepciones Cuestiones

Respuesta

Si las unicas lineas para mostrar algo por pantalla son las que apare-cen aquı y sabiendo que en el bloque de sentencias 1 se produce unaexcepcion que no es subtipo de TipoExcepcion, ¿Que se muestra porpantalla?

try{bloque de sentencias 1System.out.print("hola");

}catch(TipoExcepcion e){bloque de sentencias 2System.out.print("adios");

}System.out.print("fin");

No se muestra nada. La ejecucion se detiene.

Introduccion Clases abstractas Errores y excepciones Cuestiones

Pregunta

Si las unicas lineas para mostrar algo por pantalla son las que apa-recen aquı y sabiendo que en el bloque de sentencias 1 se produceuna excepcion que es subtipo de TipoExcepcion, ¿Que se muestrapor pantalla?

try{bloque de sentencias 1System.out.print("hola");}catch(TipoExcepcion e){bloque de sentencias 2System.out.print("adios");}System.out.print("fin");

Introduccion Clases abstractas Errores y excepciones Cuestiones

Respuesta

Si las unicas lineas para mostrar algo por pantalla son las que apa-recen aquı y sabiendo que en el bloque de sentencias 1 se produceuna excepcion que es subtipo de TipoExcepcion, ¿Que se muestrapor pantalla?

try{bloque de sentencias 1System.out.print("hola");

}catch(TipoExcepcion e){bloque de sentencias 2System.out.print("adios");

}System.out.print("fin");

Se muestra: adiosfin

Introduccion Clases abstractas Errores y excepciones Cuestiones

Pregunta

Si las unicas lineas para mostrar algo por pantalla son las que apa-recen aquı y sabiendo que en el bloque de sentencias 1 se produceuna excepcion que es subtipo de TipoExcepcion, ¿Que se muestrapor pantalla?

try{bloque de sentencias 1System.out.print("hola");

}catch(TipoExcepcion e){bloque de sentencias 2System.out.print("adios");

}finally{System.out.print("buenas");

}System.out.print("fin");

Introduccion Clases abstractas Errores y excepciones Cuestiones

Respuesta

Si las unicas lineas para mostrar algo por pantalla son las que apa-recen aquı y sabiendo que en el bloque de sentencias 1 se produceuna excepcion que es subtipo de TipoExcepcion, ¿Que se muestrapor pantalla?

try{bloque de sentencias 1System.out.print("hola");

}catch(TipoExcepcion e){bloque de sentencias 2System.out.print("adios");

}finally{System.out.print("buenas");

}System.out.print("fin");

Se muestra: adiosbuenasfin