unidad 5 ppo

Upload: gamaliel

Post on 09-Jan-2016

2 views

Category:

Documents


0 download

DESCRIPTION

En este tema veremos conceptos básicos de programación en .java

TRANSCRIPT

5.1 Definicin de excepciones

Una excepcin es un evento que ocurre durante la ejecucin de un programa y detiene el flujo normal de la secuencia de instrucciones de ese programa; en otras palabras, una excepcin es una condicin anormal que surge en una secuencia de cdigo durante su ejecucin.Las excepciones en Java estn destinadas, al igual que en el resto de los lenguajes que las soportan, para la deteccin y correccin de errores. Si hay un error, la aplicacin no debera morirse y generar uncore(o uncrashen caso del DOS). Se debera lanzar (throw) una excepcin que a su vez debera capturar (catch) y resolver la situacin de error, o poder ser tratada finalmente (finally) por un gestor por defecto u omisin. Java sigue el mismo modelo de excepciones que se utiliza en C++. Utilizadas en forma adecuada, las excepciones aumentan en gran medida la robustez de las aplicaciones.La gestin de excepciones en Java proporciona un mecanismoexcepcionalmentepoderoso para controlar programas que tengan muchas caractersticas dinmicas durante su ejecucin. Las excepciones son formas muy limpias de manejar errores y problemas inesperados en la lgica del programa, y no deberan considerarse como un mecanismo general de ramificaciones o un tipo de sentencias de salto. Los lugares ms indicados para utilizar excepciones son aquellos en los que se usan valores como 0 o 1, en C/C++, para indicar algn fallo funcional. Por ejemplo:#include int fd;fd = open( "leeme.txt" );if( fd == -1 && errno == EEXIT )fd = open( "defecto.txt" );}En este programa C, si falla la primera sentenciaopen()por cualquiera de las 19 razones distintas de EEXIT por las que puede fallar, entonces el programa se continuara ejecutando y morira por alguna razn misteriosa ms adelante, dejando atrs un problema de depuracin complicado y frustrante.La versin Java del cdigo anterior, tal como se muestra a continuacin:FilterReader fr;try { Fr = new FilterReader( "leeme.txt" );} catch( FileNotFoundException e ) { fr = new FilterReader( "defecto.txt" ); }

Proporciona una oportunidad para capturar una excepcin ms genrica y tratar la situacin con elegancia o, en el peor de los casos, imprimira el estado de la pila de memoria.Por ello, que la utilizacin adecuada de las excepciones proporcionar un refinamiento profesional al cdigo que cualquier usuario futuro de las aplicaciones que salgan de la mano del programador que las utilice agradecer con toda seguridad

5.2 Tipos de excepciones

Qu es una excepcin?Una excepcin es un evento que ocurre durante la ejecucin del programa que interrumpe el flujo normal de las sentencias.sea, algo que altera la ejecucin normal.Muchas clases de errores pueden generar excepciones desde problemas de hardware, como la avera de un disco duro, a los simples errores de programacin, como tratar de acceder a un elemento de un array fuera de sus lmites.

TIPOS DE EXCEPCIONESExisten varios tipos fundamentales de excepciones: Error: Excepciones que indican problemas muy graves, que suelen ser no recuperables y no deben casi nunca ser capturadas. Exception: Excepciones no definitivas, pero que se detectan fuera del tiempo de ejecucin. RuntimeException: Excepciones que se dan durante la ejecucin del programa.

Todas las excepciones tienen como clase base la claseThrowable, que est incluida en el paquetejava.lang, y sus mtodos son: Trowable( String mensaje ); Constructor. La cadena es opcional Throwable fillInStackTrace();Llena la pila de traza de ejecucin. String getLocalizedMessage();Crea una descripcin local de este objeto. String getMessage();Devuelve la cadena de error del objeto. void printStackTrace( PrintStream_o_PrintWriter s ); Imprime este objeto y su traza en el flujo del parmetro s, o en la salida estndar (por defecto). String toString;Devuelve una breve descripcin del objeto.

Funcionamiento

Para que el sistema de gestin de excepciones funcione, se ha de trabajar en dos partes de los programas: Definir qu partes de los programas crean una excepcin y bajo qu condiciones. Para ello se utilizan las palabras reservadasthrowythrows. Comprobar en ciertas partes de los programas si una excepcin se ha producido, y actuar en consecuencia. Para ello se utilizan las palabras reservadastry, catchyfinally.

b)Manejo de excepciones: try - catch - finally

Cuando el programador va a ejecutar un trozo de cdigo que pueda provocar una excepcin (por ejemplo, una lectura en un fichero), debe incluir este fragmento de cdigo dentro de un bloquetry:try {

// Cdigo posiblemente problemtico

}

Pero lo importante es cmo controlar qu hacer con la posible excepcin que se cree. Para ello se utilizan las clausulascatch, en las que se especifica que accin realizar:try {

// Cdigo posiblemente problemtico

} catch( tipo_de_excepcion e) {

// Cdigo para solucionar la excepcin e

} catch( tipo_de_excepcion_mas_general e) {

// Cdigo para solucionar la excepcin e

}

5.2 Tipos de excepciones

Qu es una excepcin?Una excepcin es un evento que ocurre durante la ejecucin del programa que interrumpe el flujo normal de las sentencias.sea, algo que altera la ejecucin normal.Muchas clases de errores pueden generar excepciones desde problemas de hardware, como la avera de un disco duro, a los simples errores de programacin, como tratar de acceder a un elemento de un array fuera de sus lmites.

TIPOS DE EXCEPCIONESExisten varios tipos fundamentales de excepciones: Error: Excepciones que indican problemas muy graves, que suelen ser no recuperables y no deben casi nunca ser capturadas. Exception: Excepciones no definitivas, pero que se detectan fuera del tiempo de ejecucin. RuntimeException: Excepciones que se dan durante la ejecucin del programa.

Todas las excepciones tienen como clase base la claseThrowable, que est incluida en el paquetejava.lang, y sus mtodos son: Trowable( String mensaje ); Constructor. La cadena es opcional Throwable fillInStackTrace();Llena la pila de traza de ejecucin. String getLocalizedMessage();Crea una descripcin local de este objeto. String getMessage();Devuelve la cadena de error del objeto. void printStackTrace( PrintStream_o_PrintWriter s ); Imprime este objeto y su traza en el flujo del parmetro s, o en la salida estndar (por defecto). String toString;Devuelve una breve descripcin del objeto.

Funcionamiento

Para que el sistema de gestin de excepciones funcione, se ha de trabajar en dos partes de los programas: Definir qu partes de los programas crean una excepcin y bajo qu condiciones. Para ello se utilizan las palabras reservadasthrowythrows. Comprobar en ciertas partes de los programas si una excepcin se ha producido, y actuar en consecuencia. Para ello se utilizan las palabras reservadastry, catchyfinally.

b)Manejo de excepciones: try - catch - finally

Cuando el programador va a ejecutar un trozo de cdigo que pueda provocar una excepcin (por ejemplo, una lectura en un fichero), debe incluir este fragmento de cdigo dentro de un bloquetry:try {

// Cdigo posiblemente problemtico

}

Pero lo importante es cmo controlar qu hacer con la posible excepcin que se cree. Para ello se utilizan las clausulascatch, en las que se especifica que accin realizar:try {

// Cdigo posiblemente problemtico

} catch( tipo_de_excepcion e) {

// Cdigo para solucionar la excepcin e

} catch( tipo_de_excepcion_mas_general e) {

// Cdigo para solucionar la excepcin e

}

5.3 Propagacin de excepciones

La clusulacatchcomprueba los argumentos en el mismo orden en que aparezcan en el programa. Si hay alguno que coincida, se ejecuta el bloque y sigue el flujo de control por el bloquefinally(si lo hay) y concluye el control de la excepcin.Si ninguna de las clusulascatchcoincide con la excepcin que se ha producido, entonces se ejecutar el cdigo de la clusulafinally(en caso de que la haya). Lo que ocurre en este caso, es exactamente lo mismo que si la sentencia que lanza la excepcin no se encontrase encerrada en el bloquetry.El flujo de control abandona este mtodo y retorna prematuramente al mtodo que lo llam. Si la llamada estaba dentro del mbito de una sentenciatry, entonces se vuelve a intentar el control de la excepcin, y as continuamente.Cuando una excepcin no es tratada en la rutina en donde se produce, lo que sucede es lo siguiente. El sistema Java busca un bloquetry..catchms all de la llamada, pero dentro del mtodo que lo trajo aqu. Si la excepcin se propaga de todas formas hasta lo alto de la pila de llamadas sin encontrar un controlador especfico para la excepcin, entonces la ejecucin se detendr dando un mensaje. Es decir, podemos suponer que Java nos est proporcionando un bloquecatchpor defecto, que imprime un mensaje de error, indica las ltimas entradas en la pila de llamadas y sale.No hay ninguna sobrecarga en el sistema por incorporar sentenciastryal cdigo. La sobrecarga se produce cuando se genera la excepcin.Se ha indicado ya que un mtodo debe capturar las excepciones que genera, o en todo caso, declararlas como parte de su llamada, indicando a todo el mundo que es capaz de generar excepciones. Esto debe ser as para que cualquiera que escriba una llamada a ese mtodo est avisado de que le puede llegar una excepcin, en lugar del valor de retorno normal. Esto permite al programador que llama a ese mtodo, elegir entre controlar la excepcin o propagarla hacia arriba en la pila de llamadas. La siguiente lnea de cdigo muestra la forma general en que un mtodo declara excepciones que se pueden propagar fuera de l, tal como se ha visto a la hora de tratar la sentenciathrows:tipo_de_retorno( parametros ) throws e1,e2,e3 { }Los nombrese1,e2,...deben ser nombres de excepciones, es decir, cualquier tipo que sea asignable al tipo predefinidoThrowable. Observar que, como en la llamada al mtodo se especifica el tipo de retorno, se est especificando el tipo de excepcin que puede generar (en lugar de un objetoException).He aqu un ejemplo, tomado del sistema Java de entrada/salida:byte readByte() throws IOException;short readShort() throws IOException;char readChar() throws IOException;

void writeByte( int v ) throws IOException;void writeShort( int v ) throws IOException;void writeChar( int v ) throws IOException;Lo ms interesante aqu es que la rutina que lee unchar, puede devolver un char; no el entero que se requiere en C. C necesita que se devuelva unint, para poder pasar cualquier valor a unchar, y adems un valor extra (-1) para indicar que se ha alcanzado el final del fichero. Algunas de las rutinas Java lanzan una excepcin cuando se alcanza el fin del fichero.

Cuando se crea una nueva excepcin, derivando de una claseExceptionya existente, se puede cambiar el mensaje que lleva asociado. La cadena de texto puede ser recuperada a travs de un mtodo. Normalmente, el texto del mensaje proporcionar informacin para resolver el problema o sugerir una accin alternativa. Por ejemplo:class SinGasolina extends Exception { SinGasolina( String s ) { // constructor super( s ); } ....

// Cuando se use, aparecer algo como esto try { if( j < 1 ) throw new SinGasolina( "Usando deposito de reserva" ); } catch( SinGasolina e ) { System.out.println( o.getMessage() ); }Esto, en tiempo de ejecucin originara la siguiente salida por pantalla:> Usando deposito de reservaOtro mtodo que es heredado de la superclaseThrowableesprintStackTrace(). Invocando a este mtodo sobre una excepcin se volcar a pantalla todas las llamadas hasta el momento en donde se gener la excepcin (no donde se maneje la excepcin). Por ejemplo:// Capturando una excepcin en un mtodoclass testcap { static int slice0[] = { 0,1,2,3,4 };

public static void main( String a[] ) { try { uno(); } catch( Exception e ) { System.out.println( "Captura de la excepcion en main()" ); e.printStackTrace(); } } static void uno() { try { slice0[-1] = 4; } catch( NullPointerException e ) { System.out.println( "Captura una excepcion diferente" ); } } }Cuando se ejecute ese cdigo, en pantalla observaremos la siguiente salida:> Captura de la excepcion en main()> java.lang.ArrayIndexOutOfBoundsException: -1 at testcap.uno(test5p.java:19) at testcap.main(test5p.java:9)Con todo el manejo de excepciones podemos concluir que se proporciona un mtodo ms seguro para el control de errores, adems de representar una excelente herramienta para organizar en sitios concretos todo el manejo de los errores y, adems, que se pueden proporcionar mensajes de error ms decentes al usuario indicando qu es lo que ha fallado y por qu, e incluso podemos, a veces, recuperar al programa automticamente de los errores.La degradacin que se produce en la ejecucin de programas con manejo de excepciones est ampliamente compensada por las ventajas que representa en cuanto a seguridad de funcionamiento de esos mismos programas.

5.4 Gestin de excepciones

Las excepciones son el mecanismo por el cual pueden controlarse en un programa Java las condiciones de error que se producen. Estas condiciones de error pueden ser errores en la lgica del programa como un ndice de un array fuera de su rango, una divisin por cero o errores disparados por los propios objetos que denuncian algn tipo de estado no previsto, o condicin que no pueden manejar.La idea general es que cuando un objeto encuentra una condicin que no sabe manejar crea y dispara una excepcin que deber ser capturada por el que le llam o por alguien ms arriba en la pila de llamadas. Las excepciones son objetos que contienen informacin del error que se ha producido y que heredan de la clase Throwable o de la clase Exception. Si nadie captura la excepcin interviene un manejador por defecto que normalmente imprime informacin que ayuda a encontrar quin produjo la excepcin.Existen dos categoras de excepciones: Excepciones verificadas: El compilador obliga a verificarlas. Son todas las que son lanzadas explicitamente por objetos de usuario. Excepciones no verificadas: El compilador no obliga a su verificacin. Son excepciones como divisiones por cero, excepciones de puntero nulo, o ndices fuera de rango.Generacin de excepcionesSupongamos que tenemos una clase Empresa que tiene un array de objetos Empleado (clase vista en captulos anteriores). En esta clase podramos tener mtodos para contratar un Empleado (aadir un nuevo objeto al array), despedirlo (quilarlo del array) u obtener el nombre a partir del nmero de empleado. La clase podra ser algo as como lo siguiente:public classEmpresa { String nombre; Empleado [] listaEmpleados;inttotalEmpleados = 0; . . . Empresa(String n,intmaxEmp) { nombre = n; listaEmpleados =newEmpleado [maxEmp]; } . . .voidnuevoEmpleado(String nombre,intsueldo) { if (totalEmpleados < listaEmpleados.length ) { listaEmpleados[totalEmpleados++] =newEmpleado(nombre,sueldo); } }}Observese en el mtodo nuevoEmpleado que se comprueba que hay sitio en el array para almacenar la referencia al nuevo empleado. Si lo hay se crea el objeto. Pero si no lo hay el mtodo no hace nada ms. No da ninguna indicacin de si la operacin ha tenido xito o no. Se podra hacer una modificacin para que, por ejemplo el mtodo devolviera un valor booleano true si la operacin se ha completado con xito y false si ha habido algn problema.Otra posibilidad es generar una excepcin verificada (Una excepcin no verificada se producira si no se comprobara si el nuevo empleado va a caber o no en el array). Vamos a ver como se hara esto.Las excepciones son clases, que heredan de la clase genrica Exception. Es necesario por tanto asignar un nombre a nuestra excepcin. Se suelen asignar nombres que den alguna idea del tipo de error que controlan. En nuestro ejemplo le vamos a llamar CapacidadEmpresaExcedida.Para que un mtodo lance una excepcin: Debe declarar el tipo de excepcin que lanza con la clusula throws, en su declaracin. Debe lanzar la excepcin, en el punto del cdigo adecuado con la sentencia throw.

En nuestro ejemplo:voidnuevoEmpleado(String nombre,intsueldo)throwsCapacidadEmpresaExcedida{ if (totalEmpleados < listaEmpleados.length) { listaEmpleados[totalEmpleados++] =newEmpleado(nombre,sueldo); } elsethrownewCapacidadEmpresaExcedida(nombre); }Adems, necesitamos escribir la claseCapacidadEmpresaExcedida.Sera algo as:publicclassCapacidadEmpresaExcedidaextendsException {CapacidadEmpresaExcedida(String nombre) {super("No es posible aadir el empleado " + nombre); } . . .}La sentencia throw crea un objeto de la claseCapacidadEmpresaExcedida. El constructor tiene un argumento (el nombre del empleado). El constructor simplemente llama al constructor de la superclase pasndole como argumento un texto explicativo del error ( y el nombre del empleado que no se ha podido aadir).La clase de la excepcin puede declarar otros mtodos o guardar datos de depuracin que se consideren oportunos. El nico requisito es que extienda la clase Exception. Consultar la documentacin del API para ver una descripcin completa de la clase Exception.De esta forma se pueden construir mtodos que generen excepciones.Captura de excepcionesCon la primera versin del mtodo nuevoEmpleado (sin excepcin) se invocara este mtodo de la siguiente forma:Empresa em =newEmpresa("La Mundial");em.nuevoEmpleado("Adn Primero",500);Si se utilizara este formato en el segundo caso (con excepcin) el compilador producira un error indicando que no se ha capturado la excepcin verificada lanzada por el mtodo nuevoEmpleado. Para capturar la excepcin es utiliza la construccin try / catch, de la siguiente forma:Empresa em =newEmpresa("La Mundial");try{ em.nuevoEmpleado("Adn Primero",500);}catch(CapacidadEmpresaExcedida exc) { System.out.println(exc.toString()); System.exit(1);} Se encierra el cdigo que puede lanzar la excepcin en un bloque try / catch. A continuacin del catch se indica que tipo de excepcin se va a capturar. Despus del catch se escribe el cdigo que se ejecutar si se lanza la excepcin. Si no se lanza la excepcin el bloque catch no se ejecuta.El formato general del bloque try / catch es:try{ . . .}catch(Clase_Excepcionnombre) { . . .}catch(Clase_Excepcionnombre) { . . .} . . .Observese que se puede capturar ms de un tipo de excepcin declarando ms de una sentencia catch. Tambin se puede capturar una excepcin genrica (clase Exception) que engloba a todas las dems.En ocasiones el cdigo que llama a un mtodo que dispara una excepcin tampoco puede (o sabe) manejar esa excepcin. Si no sabe que hacer con ella puede de nuevo lanzarla hacia arriba en la pila de llamada para que la gestione quien le llamo (que a su vez puede capturarla o reenviarla). Cuando un mtodo no tiene intencin de capturar la excepcin debe declararla metdiante la clusula throws, tal como hemos visto en el mtodo que genera la excepcin.Supongamos que, en nuestro ejemplo es el mtodo main de una clase el que invoca el mtodo nuevoEmpleado. Si no quiere capturar la excepcin debe hacer lo siguiente:publicstaticvoidmain(String[] args)throwsCapacidadEmpresaExcedida { Empresa em =newEmpresa("La Mundial"); em.nuevoEmpleado("Adn Primero",500);}ClusulafinallyLa clusulafinallyforma parte del bloquetry/catchy sirve para especificar un bloque de cdigo que se ejecutar tanto si se lanza la excepcin como si no. Puede servir para limpieza del estado interno de los objetos afectados o para liberar recursos externos (descriptores de fichero, por ejemplo). La sintaxis global del bloquetry/catch/finallyes:try{ . . .}catch(Clase_Excepcionnombre) { . . .}catch(Clase_Excepcionnombre) { . . .} . . .finally{ . . .}

5.5. Creacin y manejo de excepciones creadas por el usuario

Las excepciones predefinidas cubren las situaciones de error ms habituales con las que nos podemos encontrar, relacionadas con el propio lenguaje y el hardware. Cuando se desarrollan aplicaciones existen otras situaciones de error de ms alto nivel relacionadas con la funcionalidad de nuestros programas. Imaginemos una aplicacin informtica que controla la utilizacin de los remontes deuna estacin de esqu: los pases de acceso a los remontes son personales e intransferibles y dispondrn de un cdigo de barras que los identifica. Cada vez que un usuario va a hacer uso de un remonte debe introducir su pase de acceso en una mquina de validacin, que a cciona un torno y devuelve el pase.

El sistema puede constar de un ordenador central al que le llegan telemticamente los datos correspondientes a los cdigos de barras de los pases que en cada momento se estn introduciendo en cada mquina de validacin d e cada remonte; si un cdigo de barras est en regla, el ordenador enva una orden de liberar el torno para permitir al usuario acceder al remonte. El ordenador central habitualmente recibir cdigos correctos utilizados en momentos adecuados, sin embargo, en ciertas ocasiones nos encontraremos con situaciones anmalas:

1 Cdigo de barras ilegible

2 Cdigo de barras no vlido (por ejemplo correspondiente a un pase caducado)

3 Cdigo de barras utilizado en otro remonte en un periodo de tiempo demasiado breve

4 etc.

DEFINICIN DE UNA EXCEPCIN DEFINIDA POR EL PROGRAMADOR.

En programacin orientada a objetos lo ms adecuado es que las excepciones sean objetos, por lo que en Java definiremos las excepciones como clases. Nuestras clases de excepcin, en general, heredarn de la clase Exception. En las clases que nos creemos a partir de Exception, incluiremos al menos el constructor vaco y otro que contenga un String como argumento. Este String se inicializa automticamente con el nombre de la clase; la inicializacin se realiza en la superclase Throwable. El texto que pongamos al hacer uso del segundo constructor se aadir al nombre de la clase insertado por la superclase.

UTILIZACION DE UNA EXCEPCION DEFINIDA POR EL PROGRAMADOR

Una vez que disponemos de una excepcin propia, podremos programar la funcionalidad de nuestras aplicaciones provocando (lanzando) la excepcin cuando detectemos alguna de las situaciones anmalas asociadas.

En el siguiente ejemplo (ExPropiaClase) se presenta un mtodo (lnea 2) que levanta ( throw) la excepcin ExPropia cuando se lee un cero (lnea 4). La excepcin ExPropia podra levantarse en diferentes secciones de cdigo de esta u otras clases. No debemos olvidar indicar que nuestro mtodo es susceptible de lanzar la excepcin (lnea 2).

1 public class ExPropiaClase {2 public void Metodo() throws ExPropia {3 if (Teclado.Lee_int() == 0)4 throw new ExPropia();5 }6 // otros metodos7 }

Finalmente, en clases de ms alto nivel podemos programar secciones de cdigo que recojan la excepcin que hemos creado:

1 public class ExPropiaPrueba {2 public static void main (String[] args) {3 System.out.println("Hola");4 do5 try {6 ExPropiaClase Instancia = new ExPropiaClase();7 Instancia.Metodo();8 }9 catch(ExPropia e) {10 System.out.println(e);11 }12 while(true);13 }14 }