Vous êtes sur la page 1sur 13

Como programar Java, 9 edición – Deitel & Deitel

Resumen del capítulo 8 y del capítulo 11.

Capítulo 8:

8.2. Caso de estudio de la clase Tiempo

El constructor predeterminado

Cuando una clase no tiene un método constructor declarado tendrá uno por defecto y le
asigna a cada atributo un valor predeterminado. Las variables de instancia pueden
inicializarse en el momento en el momento en que sean declaradas dentro del cuerpo de
la clase, del mismo modo en que se haría con una variable local.

Uso de la clase tiempo

Cuando una clase es declarada, esta es presentada como un nuevo tipo en Java. Por
ejemplo:

Tiempo1 puestaso1; //puestaso1 guarda una referencia a un objeto Tiempo1

Notas acerca de la declaración de la clase Tiempo1

Las variables de instancia por lo general son declaradas como private. Los datos que
estas manejan muchas veces no son necesarios o del interés del usuario por lo que es
una buena práctica el ocultarlos y al solo ser accesibles mediante métodos, se protegen
de cambios no deseados.

8.3 Control del acceso a los miembros

Los modificadores de acceso public y private se encargan de controlar el acceso a las


variables y los métodos de una clasel Los miembros de una clase private no son
accesibles fuera de la clase, si se intenta llamarlos fuera de la clase, al momento de ser
compilado, se generara un mensaje de error.

8.4 Referencia a los miembros del objeto actual mediante this

This (también llamada como referencia this) permite acceder a la referencia de cualquier
objeto. En caso de llamarse un método no static para un objeto específico al campo, se
utilizara de manera implícita la palabra clave this para hacer referencia a los atributos y
a otros métodos.

Un constructor puede recibir parámetros con el mismo nombre que los atributos de la
clase pero no se trata de una práctica recomendada. Cuando un método posee una
variable local con el mismo nombre de un campo, se hará referencia a la variable local.
En ese caso, el campo dentro del alcance del método es oculto por la variable local. Sin
embargo, puede usarse la referencia this en forma explícita para hacer referencia a otros
métodos en el objeto actual.

Cada método de la clase utiliza, de manera implícita, a this para determinar el objeto
que manipulará.

8.5 Caso de estudio de la clase Tiempo: constructores sobrecargados

Para sobrecargar los métodos constructores se debe proporcionar varias declaraciones


del constructor con distintas firmas.

Constructores de la clase Tiempo2

Cuando un método constructor es declarado en una clase, el compilador no


proporcionara un constructor predeterminado. La función de un método constructor sin
parámetros es la de inicializar los atributos con los valores por defecto. La referencia tis
únicamente puede ser utilizada en la primera instrucción del cuerpo del constructor.
This puede utilizarse para llamar a un método constructor de la misma clase, esto es una
popular forma de reutilización de código.

Cuando un objeto de una clase tiene una referencia a otro objeto de la misma clase, este
podrá acceder a todos los atributos y métodos del segundo, incluyendo los del tipo
private.

8.6 Constructores predeterminados y sin argumentos

Toda clase debe tener como mínimo un método constructor. Si este no es proporcionado
en la declaración de una clase, el compilador creará un constructor predeterminado que
no recibirá argumentos cuando es invocado. Este método iniciará los atributos con los
valores especificados en sus declaraciones o con los valores predeterminados pero no es
la única tarea que realiza. Un método constructor nunca retorna valores.
8.7 Observaciones acerca de los métodos Establecer y Obtener

Los atributos de tipo private solo pueden ser modificados por los métodos de la clase,
estos métodos por lo general son del tipo public. Los métodos establecer son conocidos
como métodos mutadores al modificar el estado de un objeto (atributos). Los métodos
obtener también son conocidos como métodos de acceso o de consulta.

Comparación entre los métodos Establecer y Obtener, y los datos public

Si un atributo es declarado como public, cualquier método que cuente con una
referencia a un objeto que posea esa variable de instancia podrá leerla o modificarla. De
ser declarada como private será necesario acudir al método obtener del atributo para
poder leerla y este método puede controlar la información que el usuario recibe y la
manera en que accede a ella. Un método establecer puede controlar los valores que se
le asignaran al atributo y lanzar una excepción de ser necesario. Ambos métodos
restringen el acceso y son buenas prácticas en la ingeniería de software.

Comprobación de validez en los métodos Establecer

Un método establecer puede indicar que se le trató de asignar un valor inválido al


atributo. También se puede llamar al tipo de retorno para comprobar que se modificó
correctamente el atributo aunque por lo general estos métodos tienen un tipo de valor de
retorno void y utilizan el manejo de excepciones para indicar que se intentó ingresar un
valor inválido.

Métodos predicados

Un uso común de los métodos de acceso es evaluar si una condición es verdadera o


falsa, a dichos métodos se les conoce como métodos predicados.

8.8 Composición

Una clase puede tener referencias a objetos de otras clases como atributos, esto es
llamado como composición y algunas veces como relación tiene un.

8.10 Recolección de basura y el método finalize


Toda clase en Java cuenta con los métodos de la clase Object (paquete java.lang),
siendo uno de ellos el método finalize, el cual es usado varias veces ya que puede
provocar problemas de rendimiento y el hecho de si se llamara o no es incierto.

Todos los objetos utilizan recursos del sistema, como la memoria. Es necesario contar
con una forma disciplinada de regresarlos al sistema cuando no sean necesarias pues de
lo contrario podría haber fuga de recursos que puede impedir o hacer que sea utilizado
por otros programas. La máquina virtual de Java realiza la recolección de basura de
manera automática para liberar el espacio de memoria que deja de ser ocupado.
Generalmente esto ocurre cuando la JVM ejecuta su recolector de basura.

El recolector de basura hace un llamado al método finalize para que realice las tareas de
preparación para la terminación sobre un objeto poco antes de que el recolector de
basura lo reclame y limpie esa parte de la memoria. El método finalize no recibe
parámetros ni retorna void. Al no saber en qué momento se ejecutara el recoleptor de
basura no es recomendado ejecutar el finaliza.

8.11 Miembros de clase static

Cuando se requiere una sola copia de una variable para todos los objetos de la clase se
utiliza un campo static (la variable es conocida como variable de clase). Las variables
static representan información en toda la clase y es compartida por todos los objetos de
la clase. Estas comienzan con la palabra clave static.

Un método static no puede acceder a los miembros no static, esto se debe a que las
variables static pueden ser invocadas independientemente de si se creó o no un objeto de
clase. Para acceder a un método estático debe anteponerse el nombre de la clase y un
punto (.).

Rastreo del número de objetos empleado creados

La JVM no garantiza cuando se ejecutará el recolector de basura o si este será


ejecutado. Es posible que después de ser ejecutado no recolecte ningún objeto o solo lo
haga con un subconjunto de los objetos candidatos.

8.12 Declaración static import


Una declaración static import cuenta con dos formas: una que importa un miembro
static específico (declaración static import individual) y una que importa a todos los
miembros static de la clase (declaración static import sobre demanda).

8.13 Variables de instancia final

El principio del menor privilegio es fundamental para la buena ingeniería de software.


En el contexto de una aplicación, establece que al código solo se le debe otorgar el
privilegio y acceso que requiera para cumplir con la tarea que se le fue asignada.

Declarar un atributo como final ayuda a hacer el principio del menor privilegio. Es
recomendable hacerlo con las variables que no serán modificadas.

8.14 Caso de estudio de la clase Tiempo: creación de paquetes

Cada clase en la API de Java está contenida dentro de un paquete que posee un grupo de
clases relacionadas. Estos paquetes son definidos una vez y se pueden importar en
muchos programas. Facilitan la reutilización de código, ayudan a administrar la
complejidad de los componentes de una aplicación y proporcionan una convención para
los nombres de clases únicos.

Pasos para declarar una clase reutilizable

Una clase debe estar contenida en un paquete para ser reutilizable. Estos son los pasos a
seguir:

1. La clase debe ser public.


2. El paquete debe tener un nombre único y contar con una declaración package al
archivo de código fuente, esto debe ir antes que todas las demás declaraciones e
instrucciones. Los comentarios al no ser considerados instrucciones pueden
aparecer al principio de la aplicación.
3. Compilar la clase de manera que se coloque en la estructura de directorio de
paquete apropiada.
4. Importar la clase en el programa en que se desea reutilizar.

Especificar la ruta de clases durante la compilación

El compilador utiliza un objeto especial (cargador de clases) para localizar las clases
que necesita. El cargador de clases empieza buscando las clases estándar de Java que
están incluídas en el JDK. El siguiente paso es buscar los paquetes opcionales. Java
cuenta con un mecanismo de extensión que se permite agregar paquetes nuevos
(opcionales), para fines de desarrollo, y ejecución. De no encontrarse en las ubicaciones
anteriormente mencionados buscara en la ruta de clases. La ruta de clases contiene una
lista de ubicaciones en las que se almacenan las clases. Consisten en una listas de
directorio, también llamadas archivos de ficheros, cada uno separado por un separador
de directorio (le signo de punto y coma en Windows o los dos puntos en Linux). Cada
archivo de fichero contiene archivos individuales con directorios de otros archivos, por
lo general, comprimidos.

8.15 Acceso a paquetes

En caso de no especificarse el modificador de acceso se tendrá uno del tipo protected


por defecto para un método o variable al declararse en una clase, es decir que el acceso
será a nivel de paquete. En una declaración de clase esto no tiene un efecto específico.
En caso de que un programa utilice varias clases del mismo paquete, estas pueden
acceder a los miembros con el mismo acceso de nivel para con cada una de las otras
clases directamente mediante el uso de referencias a objetos de las clases apropiadas, o
de la clase si son static.
Capítulo 11:

Manejo de excepciones

11. 1 Introducción:

Una excepción (exception) es la indicación de un problema que puede ocurrir durante el


tiempo de ejecución. El manejo de excepciones permite crear un programa a prueba de
errores, estas ayudan a generar problemas que manejen o resuelven los problemas de
ejecución evitando que el programa deje de ser ejecutado.

Las clases que extienden de throwable (paquete java.lang), directa o indirectamente, son
las únicas que pueden hacer uso de excepciones.

11.2 Ejemplo: división entre cero sin manejo de excepciones

Las excepciones son lanzadas cuando un método encuentra un problema que no puede
solucionar. Esta información es conocida como rastreo de pila y contiene el nombre de
la excepción (java.lang.ArithmeticException) en un mensaje descriptivo, este contiene
el problema que ocurrió y la cadena de llamadas al método en que se dio la excepción,
método por método. Es incluida la ruta de ejecución que llevó a la excepción, método
por método.

11.3 Ejemplo: manejo de excepciones tipo ArithmethicException e


InputMismatchException

Este tipo de manejo de excepciones permite trazar una ruta a seguir en caso de haber
encontrado una excepción. El programa la atrapa y ejecuta las instrucciones que el
programador le ha asignado para manejar la excepción.

Encerrar código en un bloque try

Un bloque try consiste en la palabra clave try seguida de un bloque de código , este se
encontrará encerrado entre llaves. El bloque try no incluye la palabra clave try.

Atrapar excepciones

Un bloque catch (cláusula catch o manejador de excepciones) atrapa y maneja una


excepción. Inicia con la palabra clave catch y va seguida de un paréntesis que contiene
un parámetro, además de un bloque de código que estará encerrado entre llaves. El
término “bloque catch” se utiliza para referirse al código que se encuentra después de la
palabra clave catch, el término “cláusula catch” incluye también a la palabra clave
catch.

Es necesario que aparezca al menos un bloque catch o un bloque finally justo después
del bloque try. Entre los paréntesis que contienen los parámetros del bloque catch se
específica la excepción que puede procesar el manejador. En caso de ocurrir una
excepción, el primer bloque en ser ejecutado es el que coincide con el tipo de excepción
que ocurrió.

Una excepción no atrapada es ocurre una excepción y no hay un bloque catch que
coincida con ella.

Modelo de terminación del manejo de excepciones

En caso de ocurrir una excepción en un bloque try, este será terminado de inmediato y
el control del programa es transferido al primero de los bloques catch que contenga un
tipo de parámetro que coincida con el tipo de excepción lanzada. Una vez que la
excepción es manejada no se regresa al punto de lanzamiento (el bloque try ha expirado)
y el programa continua su ejecución después del último bloque catch. A esto se le llama
modelo de terminación del manejo de excepciones. En algunos lenguajes el modelo de
reanudación del manejo de excepciones el control se reanuda después del punto de
lanzamiento.

Si en el bloque try no son lanzadas excepciones, los bloques catch son ignorados. El
bloque try y sus respectivos catch y/o finally forman una instrucción try. Cuando un
bloque try es terminado, las variables locales que lo conforman desaparecen. Las
variables locales de un bloque try no son accesibles en sus bloques catch.

Uso de la cláusula throws

Esta cláusula especifica las excepciones que lanza el método. Se encuentra después de
la lista de parámetros y antes del cuerpo. Contiene una lista separada por comas de las
excepciones que serán lanzadas por el método. Estas pueden ser lanzadas mediante
instrucciones en el cuerpo del método o desde el llamado al método.

11.4 Cuándo utilizar el manejo de excepciones


El manejo de excepciones está diseñado para procesar errores sincrónicos que pueden
ocurrir en el momento en que una instrucción es ejecutada. No está diseñado para
procesar problemas relacionados con los eventos asíncronos, los cuales ocurren de
manera independiente al flujo del control del programa.

11.5 Jerarquía de excepciones en Java

Todas las clases de excepciones heredan (directa o indirectamente) de la clase


Exception, lo que forma formando una jerarquía de herencias. Los programadores
pueden extender esa jerarquía y de ese modo crear sus propias clases de excepciones.

La clase Throwable posee dos subclases, estas son Exception y Error. La clase
Exception y sus subclases representan situaciones excepcionales que pueden llegar a
ocurrir en un programa de Java y que pueden llegar a ser atrapadas por la aplicación. La
clase Error y sus subclases representan situaciones anormales que pueden ocurrir en la
JVM, estos suelen ocurrir con poca frecuencia y no deben ser atrapados por las
aplicaciones, difícilmente una aplicación puede recuperarse de los errores tipo Error.

Comparación entre excepciones verificadas y no verificadas

Java separa las excepciones en dos tipos: excepciones verificadas y excepciones no


verificadas. Esto se trata de algo importante ya que Java implementa un requerimiento
de atrapar o declarar las excepciones verificadas. Se determinara si una excepción es
verificada o no verificara por el tipo de excepción. Todos los tipos de excepciones que
son subclases de la clase RuntimeException y las de la clase Error son excepciones no
verificadas. Todas las clases clases que heredan de la clase Exception (menos la clase
RuntimeException) son excepciones verificadas. Dichas excepciones sueles ser
provocados por factores que el programa no puede controlar.

El compilador se encarga de verificar que cada una de las llamadas a un método,


incluyendo su declaración para determinar si lanza excepciones verificadas. En caso de
que esto ocurra, se encarga de asegurar que la excepción será atrapada o declarada en
una cláusula throws.

El compilador de Java no verifica el código para determinar si una excepción no


verificada es atrapada o declarada. Las excepciones no verificadas pueden ser evitadas
haciendo uso de una codificación apropiada.
Atrapar excepciones de subclases

Si se escribe un manejador catch para atrapar objetos de excepción, este también podrá
atrapar a todos los objetos de las subclases de dicha clase. Esto permite que el bloque
catch maneje los errores relacionados de manera concisa y permite el procesamiento
polimórfico de las clases excepciones relacionadas.

Sólo se ejecuta la primera cláusula catch que coincida

En caso de que varios bloques catch coincidan con un tipo específico de excepción solo
se hará uso del primer catch.

11.6 Bloque finally

Es necesario que los programas que obtienen ciertos tipos de recursos deban
devolverlos al sistema en forma explícita porque de lo contrario se dará lo que se
denomina como fuga de recursos. Java realiza de forma automática la recolección de
basura en la memoria que ya no es utilizada por los programas para así evitar que se den
las fugas de memoria. Sin embargo esto no evita que ocurran otros tipos de fugas de
recursos en Java.

El bloque finally es opcional (a veces llamado cláusula finally). En caso de de que sea
usado, este se colocará después del último bloque catch y si este no existe después del
bloque try.

El bloque try se ejecutara independientemente de que se dé o no una excepción en el


bloque try correspondiente. También lo hará en caso de que el bloque try contenga una
instrucción return, break, o continue pero no se ejecutará si la aplicación sale antes de
tiempo de un bloque try, llamando al método System.exit (este método termina de
manera instantánea la aplicación).

Debido a que un bloque finally casi siempre es ejecutado, puede contener código para
liberar recursos.

System.out y System.err son flujos, secuencias de bytes. System.out (flujo de sálida


estándar) muestra la salida de un programa, System.err (flujo de error estándar) muestra
los errores de un programa. Las salidas de estos flujos pueden ser enviadas a otra parte
que no sea el símbolo del sistema, como a un archivo. Usar dos flujos distintos le
permite al programador separar los mensajes de error de los de información.

Volver a lanzar excepciones

Las excepciones vuelven a ser lanzadas cuando un bloque catch, al momento de recibir
una excepción, no puede procesar la excepción, o no puede hacerlo de manera completa.
En el momento en que una excepción vuelve a ser lansada, se difiere el manejo de la
misma (quizás solo una parte) hacia otro bloque catch asociado con una instrucción try
exterior. Para que una excepción pueda volver a ser lanzada es necesario usar la palabra
clave throw acompañada de la referencia al objeto excepción que fue atrapado, esto no
es permitido a través del bloque finally.

11.7 Limpieza de la pila y obtención de información de un objeto excepción

Cuando una excepción es lanzada pero no atrapada en un alcance específico, la pila de


llamadas a métodos se “limpia” y hace un intento de atrapar la excepción en el siguiente
bloque try exterior. Esto es conocido como limpieza de pila. Limpiar la pila de llamadas
a métodos significa que el método que no atrapó la excepción termina. Si un bloque try
encierra esa instrucción intenta atrapar dicha excepción. En caso de que try no encierre
la instrucción o no atrapa la excepción se hace una limpieza de pila de nuevo.

Obtención de datos de un objeto excepción

La clase Throwable ofrece un método, printStackTrace que envía al flujo de error


estándar el rastreo de la pila. Esto suele ser de gran ayuda en la prueba y depuración.
Otros métodos que ofrece son: getStackTrace, este obtiene la información de rastreo de
la pila que podría ser impresa por printStackTrace y getMessage que devuelve la cadena
descriptiva almacenada en una excepción.

11.8 Excepciones encadenadas

Un método puede responder a una excepción lanzando un tipo distinto de excepción,


específico para la aplicación actual, en dicho caso se pierde la información y el rastreo
de la pila de la excepción original. En las primeras versiones de Java no se contaba con
un mecanismo para envolver la información de la excepción original junto a la nueva
excepción. Las excepciones encadenadas permiten que un objeto excepción contenga
toda la información sobre el rastreo de la pila de excepción original.
11.9 Declaración de nuevos tipos de excepciones

En caso de crearse clases que puedan ser utilizadas en sus programas puede ser
conveniente declarar excepciones específicas para posibles problemas.

Las nuevas clases excepción deben extender a una clase excepción existente, esto
permite asegurar que dicha clase utilizará el mecanismo de manejo de excepciones. Una
nueva clase de excepción, generalmente, contiene cuatro constructores, uno sin
argumentos que pasa un objeto String como mensaje de error predeterminado al
constructor de la superclase; uno que recibe un mensaje de error personalizado como un
objeto String y que pasará al constructor de la superclase; uno que recibe un mensaje de
error personalizado y un objeto Throwable (encadena excepciones), y pasa ambos
objetos al constructor de la super clase.

11.10 Precondiciones y poscondiciones

Las precondiciones y poscondiciones son herramientas utilizadas para especificar los


estados esperados antes y después de la ejecución de un método.

Una precondición debe ser verdadera en el momento en que se invoca un método.


Describen las restricciones en los parámetros del método y en cualquier otra expectativa
que este pueda tener en relación con el actual estado del programa antes de que la
ejecución inicie. En caso de que no se cumplan, el método tendrá un comportamiento
indefinido, en este caso puede enviarse una excepción y decidir entre continuar con un
valor ilegal o recuperarse del error. El que no se cumplan las precondiciones no justifica
un comportamiento inconsistente.

Una poscondicion es verdadera una vez que el método regresa con éxito. Describen las
restricciones en el valor de retorno y en sus posibles efectos secundarios. Deben ser
documentadas para que otros programadores puedan saber lo que se está esperando. Es
necesario verificar que las poscondiciones sean cumplidas si las precondiciones se
cumplen.

Si no se cumplen las precondiciones o poscondiciones, generalmente, se lanzan


excepciones.

11.11 Aserciones
Cuando una clase es depurada e implementada, puede llegar a ser conveniente
establecer condiciones que deban ser verdaderas en un punto específico de un método.A
estas condiciones se les llama aserciones, ayudan a asegurar la validez de un programa
al atrapar los errores potenciales y a identificar posibles errores lógicos durante el
desarrollo. Un ejemplo son las precondiciones y las poscondiciones.

Pueden establecerse como comentarios cuya función es guiar al programador durante el


desarrollo del programa. Java incluye dos versiones de la instrucción assert para validar
aserciones mediante la programación. Con la instrucción assert se evalúa una expresión
boolean, de ser falsa se lanzará una excepción AssertionError (subclase de Error).

Las aserciones son usadas, principalmente, para depurar e identificar errores lógicos.
Deben ser habilitadas de manera explícita al ejecutar un programa, ya que reducen el
rendimiento y carecen de utilidad para el usuario.

Los errores de tipo AssertionError deben permanecer ocultos para el usuario. Solo
podrán mostrarse en la implementación.

11.12 (Nuevo en Java SE 7) Cláusula catch múltiple: atrapar varias excepciones en


un catch

Es común que un bloque try tenga varios bloques catch para manejar diferentes
excepciones. En caso de que los cuerpos de los catch sean idénticos puede usarse la
nueva característica multi-catch de Java SE7 para atrapar dichas excepciones en un solo
manejador catch donde los tipos de excepciones serán separados con una barra vertical.

11.13 (Nuevo en Java SE7): Cláusula try con recursos (try-with-resources):


desasignación automática de recursos

Generalmente el bloque finally es el que se utiliza para asegurar que los recursos sean
liberados en el bloque try correspondiente sin embargo la opción try con recursos
(nueva en Java SE7) es una alternativa que permite simplificar la escritura de código en
donde se obtienen uno o más recursos, es utilizado en un bloque try y se libera en el
correspondiente bloque finally.

Vous aimerez peut-être aussi