You are on page 1of 31

Apuntes de Java

Departamento de Ciencia de la Computacin e Inteligencia Articial Escuela Politcnica Superior Universidad de Alicante 4 de octubre de 2001

ndice General
ndice General Prlogo 1 Introduccin 1.1 Tipos de datos 1.2 Constantes 1.3 Variables 1.4 Comentarios Estructuras de control 2.1 Condicionales 2.1.1 Sentencia if 2.1.2 Sentencia switch 2.2 Bucles 2.2.1 Sentencia while 2.2.2 Sentencia do .. while 2.2.3 Sentencia for 2.3 Sentencias try .. catch Clases y Objetos 3.1 Clases 3.1.1 Mtodos 3.1.2 Variables y mtodos de clase 3.2 Control de acceso a los miembros de una clase 3.2.1 Acceso predeterminado 3.2.2 Acceso pblico 3.2.3 Acceso privado 3.2.4 Acceso protegido 3.3 Objetos 3.3.1 Asignacin 3.3.2 Igualdad 3.4 Herencia 3.4.1 Subclases 3.4.2 Clases abstractas Packages 4.1 Introduccin 4.2 Crear un paquete 4.3 Referenciar un paquete 4.4 Los paquetes y la visibilidad de variables y mtodos i i iii 1 1 2 2 2 3 3 3 3 4 4 4 4 5 7 7 8 8 9 9 9 9 9 10 10 10 11 11 12 13 13 13 14 14

ii 5 Tratamiento de errores 5.1 Excepciones y errores 5.2 Manejo de excepciones 5.2.1 Capturar excepciones 5.2.2 Lanzar excepciones 5.2.3 Generar excepciones 5.2.4 Denir nuevas excepciones 5.3 El requisito "capturar o lanzar" Libreras estndar de Java 6.1 Operaciones matemticas: java.lang.Math 6.2 Operaciones de entrada/salida: java.io 6.2.1 E/S de bytes y caracteres 6.2.2 E/S de ms alto nivel 6.2.3 Entrada y salida estndar Uso del JDK 7.1 Uso del classpath 7.2 El compilador javac 7.3 El intrprete java Bibliografa

ndice General 17 17 17 18 18 19 19 19 21 21 21 21 22 22 23 23 24 24 25

Prlogo
ctualmente Java es el lenguaje de programacin ms popular en Internet. Eso no nos tiene que hacer olvidar que est disponible para el desarrollo de programas de uso general. A pesar de que su popularidad se deba a la gran expectacin que implica cualquier cosa relacionada con Internet, no hay que olvidar sus ventajas: Es multiplataforma (funciona en muchas mquinas). Es un lenguaje orientado a objetos bastante simple. Permite que un programador principiante produzca programas con un interfaz de usuario sosticado: botones, listas, barras de desplazamiento. Est integrado con la web (applets) Es adecuado para crear aplicaciones de bases de datos. En el mercado hay muchas herramientas de programacin Java como Forte de Sun o Visual Caf de Symantec. De todas formas, la mejor forma de introducirse en Java es a travs del kit de desarrollo de Java (JDK).

iii

iv

Prlogo

Captulo 1

Introduccin
1.1 Tipos de datos
Los tipos de datos son porttiles entre todas las plataformas que reconocen Java. Se clasican en tipos primitivos y tipos referenciados. Tipos primitivos Hay ocho tipos que se pueden clasicar en tipos numricos y el tipo boolean. Los tipos numricos se pueden dividir en tipos enteros y tipos reales. Se les llama tipos primitivos porque estn integrados en el sistema y no son objetos, esto hace que su uso sea ms eciente. De todas formas, la biblioteca de Java proporciona las clases: Byte, Character, Short, Integer, Long, Float, Double y Boolean para encapsular cada uno de los tipos. Byte: datos enteros comprendidos entre -128 y +127. Short: datos enteros comprendidos entre -32678 y +32367. Int: datos enteros comprendidos entre -2147483648 y +2147483647. Long: datos enteros comprendidos entre -9223372036854775808 y +9223372036854775807. Char: se utiliza para declarar datos enteros en el rango \u0000 .. \uF F F F en Unicode (0 a 65535). Los valores de 0 a 127 se corresponden con los caracteres ASCII del mismo cdigo. Float: datos en coma otante de 32 bits. Para especicar que una constante es de tipo oat hay que aadir al nal de su valor la letra f o F. Double: datos en coma otante de 64 bits. Una constante es de tipo double a no ser que se especique lo contrario. Boolean: se utiliza para indicar si el resultado de la evaluacin de una expresin booleana es verdadero o falso. Los dos posibles valores son true y false. Tipos referenciados Hay tres categoras: clases, interfaces y arrays. 1

Captulo 1. Introduccin

1.2

Constantes

Hay que indicar al compilador Java el nombre de la constante y su valor. Esto se hace utilizando el calicador nal y/o el static. final static int cte=3.14159F; La constante puede estar denida en el cuerpo de la clase o dentro de un mtodo. En el primer caso la constante puede estar calicada adems de con nal, con static. En el segundo caso, no se puede utilizar static, la constante slo ser visible dentro del mtodo, es local al mtodo. Una constante local no puede ser declarada static.

1.3

Variables

Una variable representa un espacio de memoria para almacenar un valor de un determinado tipo. La declaracin de una variable consiste en denir el nombre de la misma y asignarle un tipo: String nombre; Cuando la variable est declarada en el cuerpo de la clase pero fuera de cualquier mtodo se denomina variable miembro de la clase. Caso de que est declarada dentro de un mtodo es local a dicho mtodo. Las variables miembro de una clase se inicializan por defecto para cada objeto que se declare de la misma: las variable numricas a 0, los caracteres con el valor \0 y las referencias a otros objetos con null. Las variables locales no se inicializan por defecto con lo que hay que asignarles un valor inicial.

1.4

Comentarios

Java soporta tres tipos de comentarios: Comentario tradicional: empieza con los caracteres /* y naliza con los caracteres */. Estos comentarios pueden ocupar ms de una lnea. Comentario de una sola lnea: comienza con una doble barra y se extiende hasta el nal de la lnea. Comentario de documentacin: comienza con /** y termina con */. Son comentarios especiales que javadoc utiliza para generar la documentacin acerca del programa.

Captulo 2

Estructuras de control
2.1
2.1.1

Condicionales
Sentencia if

Permite a un programa tomar una decisin para ejecutar una accin u otra basndose en el resultado verdadero o falso de una expresin. La sintaxis es: if (condicin) sentencia 1; else sentencia 2; Como consecuencia de las sentencias if anidadas aparece la sentencia else if: if (condicin 1) sentencia 1; else if (condicin 2) sentencia 2; else if (condicin 3) sentencia 3; else sentencia n;

2.1.2

Sentencia switch

Permite ejecutar una de varias acciones en funcin del valor de una expresin. Es una sentencia para decisiones mltiples. La sintaxis es: switch (expresin) { case expresin-constante 1: sentencia 1; case expresin-constante 2: sentencia 2; default: sentencia n; } 3

Captulo 2. Estructuras de control

donde expresin es una expresin de tipo char, byte, short o int. La sentencia switch evala la expresin entre parntesis y compara su valor con las constantes de cada case. La ejecucin de las sentencias comienza en el case cuya constante coincide con el valor de la expresin y contina hasta el nal de la estructura switch o hasta una sentencia que transera el control fuera del bloque, por ejemplo la sentencia break. En una sentencia switch se pueden hacer declaraciones en el bloque de cada case pero no antes del primer case. switch (n) { case 1: System.out.println("Positivo"); break; case -1: System.out.println("Negativo"); break; default: System.out.println("Desconocido"); }

2.2
2.2.1

Bucles
Sentencia while

Ejecuta una sentencia, simple o compuesta, cero o ms veces, dependiendo del valor de una expresin booleana. Su sintaxis es: while (condicin) sentencia; ta. donde condicin es cualquier expresin booleana y sentencia puede ser simple o compues-

2.2.2

Sentencia do .. while

Ejecuta una sentencia, simple o compuesta, una o ms veces, dependiendo del valor de una expresin booleana. Su sintaxis es: do sentencia; while (condicin);

2.2.3

Sentencia for

Permite ejecutar una sentencia simple o compuesta un nmero de veces conocido. Su sintaxis es: for (v1=e1, v2=e2;condicin;progreso-condicin) sentencia; donde v1, v2, ... representan variables de control que sern iniciadas con las expresiones e1, e2, ...

2.3. Sentencias try .. catch

2.3

Sentencias try .. catch

Cuando durante la ejecucin de un programa ocurre un error, Java lanza una excepcin que visualiza un mensaje acerca de lo ocurrido y detiene la ejecucin. Si no queremos que se detenga la ejecucin podemos utilizar un try para alertar a la aplicacin acerca del cdigo que puede lanzar una excepcin y emplear catch para capturar y manejar la excepcin. try {

bloque de cdigo que puede causar una excepcin; } catch(Exception e) { bloque de cdigo para manejar la excepcin ; }

Captulo 2. Estructuras de control

Captulo 3

Clases y Objetos
3.1 Clases
Una clase es un tipo denido por el usuario que describe los atributos y los mtodos de los objetos que se crearn a partir de ella. El estado del objeto viene determinado por los atributos y los mtodos son las operaciones que denen su comportamiento. Dentro de los mtodos se encuentran los constructores que permiten crear un objeto y los destructores que permiten destruirlo. Los atributos y los mtodos se denominan en general miembros de la clase. La denicin de una clase consta de dos partes: el nombre de la clase precedido por la palabra reservada class y el cuerpo de la clase entre llaves: class nombre-clase { cuerpo de la clase } Dentro del cuerpo de la clase podemos encontrar atributos y mtodos. Ejemplo: class Circunferencia { private double x,y, radio; public Circunferencia() { } public Circunferencia(double cx, double cy, double r) { x=cx; y=cy; radio=r; } public void ponRadio(double r) { radio=r; } public double longitud() { return 2*Math.PI*radio; } } 7

Captulo 3. Clases y Objetos

En este ejemplo se dene la clase Circunferencia, puede ser usada dentro de una programa de la misma manera que cualquier otro tipo. Un objeto de esta clase tiene tres atributos (coordenadas del centro y valor del radio), dos constructores y un mtodo. Los constructores se distinguen fcilmente porque tienen el mismo nombre que la clase. Los atributos se declaran de la misma manera que cualquier variable. En una clase, cada atributo debe tener un nombre nico. Siguiendo las recomendaciones de la programacin orientada a objetos, cada clase se debe implementar en un chero .java, de esta manera es ms sencillo modicar la clase. Una aplicacin es un programa Java que consiste de una o ms clases. Una de las clases tiene que ser una clase aplicacin (clase que incluye el mtodo main). La denicin del mtodo main es la siguiente: public static void main(String[] args) { cuerpo del mtodo } El mtodo main es pblico, esttico, no devuelve nada y tiene un argumento de tipo String que almacena los argumentos pasados en la lnea de rdenes cuando se invoca a la aplicacin para su ejecucin. Cuando se compile el chero que contiene la aplicacin, el compilador Java genera un chero .class por cada una de las clases que la componen. Cada chero generado tiene el mismo nombre que la clase que lo contiene.

3.1.1

Mtodos

Los mtodos forman lo que se denomina interfaz de los objetos, denen las operaciones que se pueden realizar con los atributos. Desde el punto de vista de la Programacin Orientada a Objetos, el conjunto de mtodos se corresponde con el conjunto de mensajes que los objetos de una clase pueden responder. Los mtodos permiten al programador modularizar sus programas. Todas las variables declaradas en las deniciones de mtodos son variables locales: slo se conocen en el mtodo que las dene. Casi todos los mtodos tienen una lista de parmetros que permiten comunicar informacin. La denicin de un mtodo indica el tipo de datos del resultado que devuelve public double longitud(). Para mtodos que no devuelven nada se utiliza la palabra reservada void.

3.1.2

Variables y mtodos de clase

Cada objeto de una clase tiene su propia copia de todas las variables de la clase. En ciertos casos, resulta adecuado tener una sola copia de una variable en concreto para que sea compartida por todos los objetos de esa clase. Para ello se utilizan las variables de tipo static. Para acceder a un miembro static hay que anteponer el nombre de la clase y el operador de punto al nombre del miembro de la clase. Los miembros static de una clase son accesibles aunque no existan objetos creados de esa clase. Es por ello que el mtodo main es static: se le llama sin necesidad de que haya un objeto ya creado de la clase que lo contiene. class Cuadrado { static int anchoLinea=2;

3.2. Control de acceso a los miembros de una clase static void ponAnchoLinea(int ancho) { anchoLinea=ancho; }

} ... Cuadrado.ponAnchoLinea(4);

Aunque los miembros estticos son accesibles a travs de un objeto de la clase (de la forma habitual, nombreObjeto.miembro) se considera ms adecuado acceder a ellos mediante el nombre de la clase. Un ejemplo clsico es la constante Math.PI.

3.2

Control de acceso a los miembros de una clase

El concepto de clase hace referencia a la idea de la ocultacin de datos. El usuario de una clase generalmente no tiene acceso a los atributos de esa clase directamente sino que hay que hacerlo a travs de los mtodos pblicos de la clase (mtodos de acceso). Para controlar el acceso, Java proporciona una serie de palabras reservadas que indican el tipo de acceso permitido.

3.2.1

Acceso predeterminado

Cuando no se especica ningn modicador para indicar el tipo de acceso, un miembro de la clase puede ser accedido por cualquier clase perteneciente al mismo paquete. Ninguna otra clase fuera de este paquete puede tener acceso a estos miembros. Con este tipo de control de acceso no se tiene mucho efecto sobre cmo va a ser utilizada nuestra clase por otras clases. Para evitar esto habr que utilizar los modicadores de acceso.

3.2.2

Acceso pblico

Un miembro declarado public (pblico) est accesible para cualquier clase que quiera utilizarlo. Los atributos static de una clase generalmente se declaran como pblicos. Un ejemplo es el atributo PI de la clase Math (public static final double PI).

3.2.3

Acceso privado

Un miembro declarado private slo es accesible por los mtodos de su propia clase.

3.2.4

Acceso protegido

Un miembro declarado protected se comporta igual que un miembro privado para los mtodos de las otras clases excepto para los mtodos de las clases del mismo paquete o de sus subclases, para las que se comporta como un miembro pblico.

10

Captulo 3. Clases y Objetos

3.3

Objetos

Un objeto consta de una estructura interna (los atributos) y de una interfaz que permite acceder y manipular dicha estructura (los mtodos). Para construir un objeto de una clase cualquiera hay que llamar a un mtodo de iniciacin, el constructor. Para ello se utiliza el operador new. Circunferencia circ = new Circunferencia(); La funcin del constructor es iniciar nuevos objetos de su clase. Cuando se crea un objeto, Java hace lo siguiente: Asignar memoria al objeto por medio del operador new. Iniciar los atributos de ese objeto, sus valores iniciales o los valores predeterminados por el sistema: los atributos numricos a cero, los alfanumricos a nulos y las referencias a objetos a null. Llamar al constructor de la clase. Si no hay suciente memoria para ubicar el objeto, el operador new lanza una excepcin OutOfMemoryError. Para acceder desde un mtodo de una clase a un miembro de un objeto de otra clase diferente se utiliza la sintaxis: objeto.miembro. Cuando el miembro accedido es un mtodo se entiende que el objeto ha recibido un mensaje, el especicado por el nombre del mtodo y responde ejecutando ese mtodo.Los objetos se destruyen con un recolector de basura, de eso se ocupa Java.

3.3.1

Asignacin

Analicemos el siguiente ejemplo: Circunferencia c1 = new Circunferencia(0,0,15); Circunferencia c2 = c1; c1.ponRadio(25); System.out.println(c2.radio); Una vez el objeto est creado, tenemos una referencia a ese objeto, la variable c1 apunta a un objeto de la clase Circunferencia. Debido a la asignacin, la variable c2 apunta al mismo objeto. Despus modicamos el valor del radio del objeto Circunferencia apuntado por c1. Por ltimo, el valor que se visualiza es 25 (System.out.println(c2.radio)).

3.3.2

Igualdad

Creamos dos objetos iguales (con los mismos valores de sus variables miembro), al preguntar si las variables que apuntan a esos objetos son iguales nos devolver false. Circunferencia c1 = new Circunferencia(0,0,15); Circunferencia c2 = new Circunferencia(0,0,15); if (c1==c2)

3.4. Herencia

11

3.4

Herencia

La herencia es la manera ms sencilla de especicar una forma de acceder a una clase ya existente. Tambin sirve para denir una nueva clase que aada nuevas caractersticas a una clase ya denida. Esta nueva clase se denomina subclase o clase derivada y la clase ya existente superclase o clase base. Con la herencia todas las clases estn clasicadas segn una jerarqua. Cada clase tiene su superclase y adems puede tener una o ms subclases. Se dice que las clases que estn en la parte inferior de la jerarqua heredan de las clases que estn en la parte superior. La clase Object es la clase raz de la jerarqua de clases de Java: es una clase que slo dene los atributos y el comportamiento comunes a todas las clases.

3.4.1

Subclases

Cuando queremos denir una clase que tenga las mismas capacidades que otra pero aadiendo algunas caractersticas lo hacemos deniendo una subclase. Para ello utilizamos la palabra clave extends. Si no se especica la clasula extends con el nombre de la superclase se entiende que la superclase es la clase Object. public class CuentaCredito extends Cuenta { // Cuentacredito hereda los miembros de Cuenta } Java slo permite la herencia simple, no permite que una clase herede de dos o ms clases. Una subclase hereda todos los miembros de su superclase, excepto los constructores. De todas formas eso no quiere decir que tenga acceso directo a todos los miembros (depende de cmo se haya denido el control de acceso de su superclase). Atributos con el mismo nombre Es posible denir en la subclase un atributo con el mismo que en la superclase. Para distinguir a que atributo nos referimos, utilizamos las clasulas super y this. class ClaseBase { public int valor = 1; } class ClaseDerivada extends ClaseBase { int valor = 5; public int metodoA() { return 200 + super.valor; \* atributo valor de la superclase *\ } public int metodoB() { return this.valor; \* atributo valor de la subclase *\ }

12 }

Captulo 3. Clases y Objetos

Redenir mtodos de la superclase Cuando se invoca a un mtodo en respuesta a un mensaje recibido por un objeto, Java busca su denicin en la clase del objeto. La denicin del mtodo que all se encuentra puede pertenecer a la propia clase o puede haber sido heredada de alguna de sus superclases. Si Java no encuentra la denicin, sigue buscando hacia arriba en la jerarqua de clases hasta que la encuentre. Hay ocasiones en las que deseamos que un objeto de una subclase responda al mismo mtodo heredado de la superclase pero con un comportamiento diferente. Eso implica redenir en la subclase el mtodo heredado de la superclase. Redenir un mtodo implica volver a escribirlo en la subclase con el mismo nombre, la misma lista de parmetros y el mismo tipo del valor retornado que tena en la superclase. Cuando en una subclase se redene un mtodo de una superclase, se oculta el mtodo de la superclase. Si el mtodo se redene en la subclase con distinto tipo o nmero de parmetros, el mtodo de la superclase no se oculta, se comporta como una sobrecarga de ese mtodo. Para acceder a un mtodo de la superclase que ha sido redenido en la subclase se utiliza la palabra reservada super.

3.4.2

Clases abstractas

Cuando se disea una clase para ser genrica, lo ms probable es que no necesitemos crear objetos de ella; lo que interesa es proporcionar los atributos y comportamientos que sern compartidos por todas sus subclases. Una clase con estas caractersticas se denomina clase abstracta y se dene con el calicativo abstract public abstract class Entidad { // Cuerpo de la clase } Una clase abstracta puede contener el mismo tipo de miembros que una clase que no lo sea y adems puede contener mtodos abstractos. Si un mtodo heredado por una subclase es abstracto, es obligatorio redenirlo, de lo contrario la subclase tambin debera ser declarada abstracta.

Captulo 4

Packages
Los paquetes (packages ) de Java desempean un papel equivalente al de las libreras de otros lenguajes. De hecho, las libreras estndar que incorpora el JDK estn denidas como packages. Aqu veremos para qu sirve un package, cmo se crea y cmo se referencian las clases denidas en l.

4.1

Introduccin

Los packages de Java tienen bsicamente tres utilidades: 1. Organizar y agrupar clases relacionadas entre s. 2. Evitar conictos en los nombres de las clases. Dos clases denidas por el usuario pueden tener el mismo nombre siempre y cuando residan en paquetes distintos. 3. Permitir el acceso a las variables y mtodos denidos en una clase. Por defecto, las variables y mtodos son accesibles entre clases del mismo paquete. Fsicamente, un package ser un conjunto de cheros .class que residen dentro de un mismo directorio o bien un nico chero .jar que los contiene a todos (ste no es ms que un chero .zip al que se le puede aadir una rma digital e informacin adicional sobre su contenido).

4.2

Crear un paquete

Para especicar que las clases denidas en un chero pertenecen a un determinado paquete, hay que emplear la sentencia package nombrePaquete; Esta sentencia debe ser la primera que aparezca en el chero. En caso de que no aparezca la sentencia package, se asume que las clases denidas pertenecen a un paquete "sin nombre". Para ponerle nombre a un paquete se sigue un estilo jerrquico similar al Sistema de Nombres de Dominio empleado en Internet. As, por ejemplo, podramos tener un chero esfera.java, perteneciente a una hipottica librera grca y especicar que pertenece al mismo paquete en el que denimos los restantes objetos 3D de la siguiente manera: 13

14

Captulo 4. Packages

package graficos.3D.objetos; class Esfera { public void Esfera(float x, float y, float z, float radio) { ... } ... } La mquina virtual Java asumir que el chero reside en una estructura de directorios que reeja el nombre del paquete. Es decir, debe existir un directorio graficos, dentro de l debe haber otro directorio 3D y dentro de este ltimo otro directorio objetos, en el que est almacenado nuestro chero. Para que el compilador y el intrprete Java puedan localizar las clases del paquete, toda esta estructura de directorios debe residir en un directorio incluido en el classpath (ver apartado 7.1).

4.3

Referenciar un paquete

Para referenciar una clase denida en un paquete distinto al actual, podemos hacerlo mediante el nombre de la clase precedido por el nombre del paquete. Por ejemplo, para crear un objeto de la clase Esfera denida en el ejemplo anterior se hara: Esfera e = new graficos.3D.objetos.Esfera(0.0, 0.0, 0.0, 1.0); Evidentemente, esta forma de referenciar una clase es bastante engorrosa. Para evitarla, Java proporciona la sentencia import, que nos permite referirnos a las clases denidas en un paquete sin necesidad de poner el nombre del mismo, por ejemplo: import graficos.3D.objetos.Esfera; Esfera e = new Esfera(0.0, 0.0, 0.0, 1.0); No obstante, en caso de que se tengan dos clases con el mismo nombre dentro de dos paquetes distintos, para referenciarlas ser necesario utilizar el nombre de la clase precedido del paquete. El import del ejemplo anterior importara nicamente la clase Esfera. Para importar todas las clases de un paquete, hay que utilizar el smbolo *, por ejemplo: import graficos.3D.objetos.*; Hay que destacar que con una sola sentencia import se puede importar una clase o bien todas, pero no se pueden importar algunas s y otras no. Para facilitar la programacin, la mquina virtual Java importa automticamente tres paquetes: el paquete "sin nombre" (clases no metidas dentro de ningn paquete concreto), el paquete java.lang y el paquete al que pertenece la clase actual.

4.4

Los paquetes y la visibilidad de variables y mtodos

Por defecto, las variables y mtodos denidos en una clase perteneciente a un paquete son accesibles desde cualquier otra clase del mismo paquete. El modicador protected hace que

4.4. Los paquetes y la visibilidad de variables y mtodos

15

la visibilidad se ample adems a las clases derivadas. Finalmente, el modicador private hace que la visibilidad quede restringida nicamente a instancias de la misma clase. Como se ha comentado anteriormente, en caso de que una clase no se especique como perteneciente a un paquete determinado, la mquina virtual Java la coloca automticamente dentro del paquete "por defecto", por lo que entre todas estas clases habr visibilidad de variables y mtodos.

16

Captulo 4. Packages

Captulo 5

Tratamiento de errores
Java utiliza un mecanismo de gestin de errores bastante distinto al de la mayora de lenguajes imperativos "clsicos". En lenguajes como C, cada vez que se llama a una funcin susceptible de producir un error es responsabilidad del programador comprobar que todo ha ido correctamente (generalmente a travs del valor de retorno de la funcin). En Java (y otros lenguajes, como C++), se puede especicar que cuando se produzca un error dentro de un bloque de cdigo, el ujo de ejecucin salte a otro bloque encargado de manejar los errores. Como se ver, este mecanismo de gestin de errores es mucho ms potente que el tradicional y genera cdigo "ms limpio".

5.1

Excepciones y errores

Una excepcin es cualquier evento que interrumpe el ujo de ejecucin normal de un programa. La causa de una excepcin puede ser muy variada: desde errores de hardware hasta fallos de programacin, como un ndice de matriz fuera de rango. Las excepciones son clases Java, todas descendientes de la clase Exception denida en la librera estndar. Para saber cul es la jerarqua de clases denida para las excepciones, lo mejor es consultar la documentacin del API Java que viene con el JDK. En realidad, hay otra jerarqua de clases, descendientes de error, pero normalmente el programador puede ignorarlas, ya que representan errores graves, que suelen hacer que la mquina virtual imprima un mensaje y nalice inmediatamente la ejecucin del programa.

5.2

Manejo de excepciones

Ante una excepcin, el programador puede realizar tres acciones distintas: 1. Ignorarla, dejando que la gestione el propio intrprete Java. Esto es lo que se suele hacer con los errores representados por las clases que descienden de error o de RuntimeException, ya que suelen ser errores que provocan el paro inmediato del programa. 2. Capturar la excepcin mediante las sentencias try y catch. De esta forma se puede especicar qu es lo que debe hacer el programa si se produce una excepcin dentro de un bloque de cdigo determinado. 17

18

Captulo 5. Tratamiento de errores

3. "Lanzar" la excepcin, es decir, forzar a que se encargue de gestionarla el mtodo que haya llamado al mtodo actual. De esta forma, la excepcin va viajando por la pila de llamadas a mtodos hasta que alguno se encarga de ella. La accin a tomar depender del tipo de excepcin que se haya producido. Java distingue entre excepciones comprobadas, que son excepciones que no pueden ignorarse (o se capturan o se lanzan), y excepciones sin comprobar, que s pueden pasarse por alto.

5.2.1

Capturar excepciones

Para gestionar explcitamente lo que debe hacer un programa cuando se produzca una determinada excepcin se utilizan las sentencias try y catch. La sentencia try debe envolver al bloque en el que se quiere comprobar si ha habido alguna excepcin, mientras que el catch representa el cdigo que se ejecutar en caso de que sta se produzca. Por ejemplo: try { ... z=x/y; ... } catch(ArithmeticException e) { System.out.println("error aritmetico: }

" + e);

Como puede verse, la sentencia catch acta como si fuera un mtodo, aceptando como parmetro el tipo de excepcin que se desea capturar. Para capturar cualquier excepcin, habr que utilizar la clase base Exception. En el ejemplo se capturan nicamente las excepciones aritmticas (clase ArithmeticException), cuyo ejemplo ms tpico es la divisin por cero, en cuyo caso se imprime un mensaje de error por la salida estndar. Hay que tener en cuenta que una sentencia try puede tener asociadas varias catch, de manera que cada una de ellas capture un tipo distinto de excepcin. Por ejemplo: try { leerFichero("entrada.txt"); ... } catch(FileNotFoundException e) { \\ Cdigo a ejecutar en caso de que el fichero no exista ... } catch(IOException e) { \\ Cdigo a ejecutar en caso de que haya error de lectura ... }

5.2.2

Lanzar excepciones

En caso de que se produzca una excepcin en un trozo de cdigo que no est envuelto en un try, sta pasa al mtodo desde el que se llam al mtodo actual. De este modo, va ascendiendo

5.3. El requisito "capturar o lanzar"

19

por la pila de llamadas a mtodos hasta que es recogida mediante un catch o bien hasta que llega al nivel superior y pasa al control del intrprete Java. Para que este mecanismo funcione, es necesario especicar en la cabecera del mtodo que ste lanza la excepcin. Esto se hace mediante el modicador throws. Por ejemplo: void leerFichero(String nombre) throws IOException, FileNotFoundException La cabecera anterior indica que en el caso de que se produzca una excepcin del tipo IOException o FileNotFoundException dentro del mtodo leerFichero, sta debe pasar al mtodo que lo llam.

5.2.3

Generar excepciones

Podemos producir una excepcin mediante la sentencia throw. Esta sentencia detiene el ujo de control y lo pasa al try/catch ms cercano. Por ejemplo: throw new Exception("Se ha producido un error"); Normalmente, esta sentencia se usar en conjuncin con clases de excepciones denidas por el usuario. Cmo denirlas se explica a continuacin.

5.2.4

Denir nuevas excepciones

Para denir nuevas clases de excepciones basta con crearlas como subclases de alguna de la jerarqua de excepciones incluida en Java. Por ejemplo: class miExcepcion extends Exception { miExcepcion(String mens) { super(mens); } }

5.3

El requisito "capturar o lanzar"

Como se ha comentado antes, en el caso de lo que Java llama excepciones comprobadas es necesario, o bien capturar la excepcin (mediante try y catch) o bien declarar que el mtodo la lanza (poniendo el throws en la cabecera). Por ello, si llamamos a un mtodo que puede lanzar una excepcin comprobada (porque as lo declara en su cabecera) ser necesario lanzarla a nuestra vez o bien capturarla. En caso contrario el compilador generar un mensaje de error, negndose a compilar nuestro cdigo. Esto es lo que ocurre con muchos mtodos Java de la librera estndar. Por ejemplo, la clase FileReader sirve para leer de un chero. El constructor de FileReader, que acepta como argumento el nombre del chero a leer, puede lanzar una excepcin del tipo FileNotFoundException, en caso de que ste no exista. Por tanto, si creamos un objeto de la clase FileReader habr que envolver su instanciacin en un try/catch o bien incluir un throws FileNotFoundException en la cabecera del mtodo en que se instancia.

20

Captulo 5. Tratamiento de errores

Captulo 6

Libreras estndar de Java


Las libreras estndar de Java incorporan un gran nmero de packages que facilitan la programacin en muchas reas distintas. As, tenemos por ejemplo clases para programacin en red (java.net), entrada/salida (java.io), estructuras de datos como vectores y colecciones (java.util), programacin de applets (java.applet) o de interfaces grcos (java.awt). Aqu veremos solo algunas de las libreras ms bsicas. Para el resto, lo mejor es consultar la documentacin sobre el API de Java que se distribuye junto son el SDK.

6.1

Operaciones matemticas: java.lang.Math

La clase java.lang.Math encapsula las constantes y operaciones matemticas ms comunes. Todos los miembros y mtodos de esta clase son de tipo static. Por ello, no es necesario instanciar ningn objeto de la clase Math, sino que los mtodos se usan directamente con el nombre de la clase. As, por ejemplo, podemos llamar en nuestro cdigo a Math.cos(angulo) o a Math.abs(valor). Adems, tenemos constantes predenidas como Math.PI o Math.E.

6.2

Operaciones de entrada/salida: java.io

La jerarqua de clases denidas en java.io para realizar operaciones de entrada/salida es bastante amplia. En este apartado nicamente comentaremos las clases bsicas. La referencia completa la proporciona, por supuesto, la documentacin que incluye el Java SDK.

6.2.1

E/S de bytes y caracteres

Segn si la operacin est orientada a bytes o caracteres, tenemos dos jerarquas de clases distintas 1 . Todas las clases que se ocupan de E/S de bytes reciben un nombre del tipo xxxInputStream (las de entrada) o xxxOutputStream (salida). Las que hacen lo propio con caracteres son las xxxReader y xxxWriter respectivamente. As, por ejemplo, la clase que sirve para leer bytes de un array es ByteArrayInputStream, y la clase empleada para escribir caracteres en un chero, FileWriter. Las clases que realizan operaciones de entrada (tanto de bytes como de caracteres) comparten el mtodo read. Versiones sobrecargadas de read sirven para leer secuencias de bytes
1 Hay que tener en cuenta que Java usa el juego de caracteres Unicode, que emplea dos bytes por carcter, con lo que ambos no son equivalentes, al contrario de lo que ocurre en, por ejemplo, C.

21

22

Captulo 6. Libreras estndar de Java

o caracteres y almacenarlos en un array. Lo mismo ocurre con las clases que implementan operaciones de salida y el mtodo write. As, el siguiente fragmento de cdigo servira para copiar los contenidos de un chero en otro: FileReader in = new FileReader("datos.txt"); FileWriter out = new FileWriter("copia.txt"); int c; while ((c = in.read()) != -1) out.write(c); in.close(); out.close(); En el cdigo anterior, se utilizan las clases FileReader y FileWriter que, como es de suponer, implementan lectura y escritura de caracteres en un chero, respectivamente.

6.2.2

E/S de ms alto nivel

En el paquete java.io se denen una serie de clases que incorporan funcionalidades ms complejas que la simple e/s de bytes o caracteres. As, por ejemplo hay clases que incorporan un buer para hacer ms ecientes las operaciones, u otras que realizan lectura de tipos de datos como int o double. A la hora de utilizar estas clases, la idea es instanciar primero un objeto que nos d la funcionalidad bsica (por ejemplo, un FileInputStream, lectura de bytes de un chero) y utilizar ste como base para instanciar la clase compleja. Por ejemplo: FileInputStream f = new FileInputStream("datos"); DataInputStream d = new DataInputStream(f); d.readInt(); d.readDouble(); d.readChar(); Como puede observarse, el constructor de la clase DataInputStream acepta como parmetro un objeto de la clase bsica FileInputStream. Adems,DataInputStream incorpora una serie de mtodos para leer datos de tipo int, double o char, entre otros.

6.2.3

Entrada y salida estndar

La entrada y salida estndar en Java estn representadas por los objetos System.in y System.out, respectivamente. El primero es un objeto de la clase inputStream. La salida estndar es un objeto de la clase PrintStream, que dene los mtodos print y println y que sirven para imprimir cualquier tipo de dato (println imprime adems un retorno de carro nal).

Captulo 7

Uso del JDK


Aunque existen diversos compiladores y mquinas virtuales Java, tanto comerciales como libres, el kit estndar para el desarrollo de programas en Java es el JDK, desarrollado por Sun y distribuido de forma gratuita. En el momento de redactar estas lneas, el JDK es accesible a travs de http://java.sun.com/j2se. Este kit incluye diversas herramientas, como un compilador (javac), una mquina virtual (java), un depurador (jdb), una herramienta para documentar automticamente el cdigo (javadoc), y otras.

7.1

Uso del classpath

Para que el compilador o el intrprete java puedan localizar las clases empleadas en un programa que no sean parte de las libreras estndar, es necesario indicar en qu directorios pueden estar almacenadas. Esto se puede hacer mediante la variable de entorno CLASSPATH. Esta variable acta de una manera similar a la variable PATH de DOS o de UNIX, pero en lugar de con ejecutables, con cheros Java. Segn cmo estn almacenadas las clases a referenciar habr que hacerlo de una forma u otra: 1. Para clases almacenadas en un chero .jar o .zip, el classpath debe referenciar el nombre del chero (con la trayectoria para llegar hasta l). Por ejemplo, para emplear la librera graficos.jar que est en el directorio c:\java habr que aadir c:\java\graficos.jar al classpath 2. Para clases en un chero .class que no estn en ningn paquete el classpath debe referenciar el directorio donde estn almacenadas. 3. Para clases en un chero .class que estn en un paquete, el classpath debe referenciar el directorio del que cuelga la estructura de directorios que reeja el nombre del paquete. Por ejemplo, supongamos que se desea utilizar una clase Esfera, denida en el chero Esfera.class y que se encuentra en el paquete graficos.3D.objetos. Como se explic en el apartado 4.2, el chero Esfera.class debera estar en un directorio graficos\3D\objetos. En el classpath habr que aadir, por tanto, la trayectoria para llegar hasta el directorio graficos (sin el nombre de este ltimo). Las referencias del classpath se separan mediante el smbolo ; en DOS o : en UNIX, al igual que en el caso de la variable PATH. Una alternativa a cambiar el valor de la variable de entorno CLASSPATH es emplear la opcin -classpath que aceptan todas las herramientas del Java SDK. As se puede especicar un classpath distinto para cada llamada a la herramienta. Por ejemplo: java -classpath c:\java\graficos.jar miPrograma 23

24

Captulo 7. Uso del JDK

7.2

El compilador javac

Esta herramienta convierte los cheros fuente .java en cheros .class, que pueden ser interpretados por la mquina virtual. Su uso bsico es: javac fuente.java En caso de que en el chero fuente se haga referencia a otras clases, el compilador se encargar de localizarlas y compilarlas a su vez en caso de que sea necesario. Es decir, el complador asume funciones que en otros lenguajes se confan a utilidades adicionales, como make. Por ello, a la hora de compilar un chero Java hay que seguir una serie de normas: 1. Cada chero .java debera denir una nica clase pblica. Aunque hay otros compiladores que aceptarn cheros que no cumplan esta norma, se considera una buena prctica de programacin. 2. El nombre del chero debe ser el mismo que el de la clase pblica denida en l, incluyendo maysculas y minsculas. 3. La clase principal de nuestro programa debe denir un mtodo main, que ser el que se ejecute cuando llamemos al intrprete Java. Este mtodo debe tener una signatura especial: public static void main(String[] args) 4. Como se describe en el apartado 7.1, las clases empleadas que no formen parte de la distribucin estndar de Java deben ser localizables a travs del classpath.

7.3

El intrprete java

Es la herramienta que permite ejecutar los programas compilados (cheros .class). Su uso bsico es: java clasePrincipal donde clasePrincipal es la clase que dene el mtodo main. Es importante tener en cuenta que no se debe especicar la extensin .class del chero que contiene la clase, ya que de lo contrario el intrprete dar un error de ejecucin. Al igual que en el caso del javac, si se hace referencia a alguna clase que no forma parte de la distribucin estndar de Java, ser necesario referenciarla en el classpath.

Captulo 8

Bibliografa
[Arnow and Weiss, 2000] D. Arnow and G. Weiss. Introduccin a la programacin con Java. Addison Wesley, 2000. [Ceballos, 2000] Fco. Ceballos. Java 2. Curso de programacin. Ra-Ma, 2000. [Deitel and Deitel, 1998] H. Deitel and P. Deitel. Cmo programar en Java. Prentice Hall, 1998. [Niemeyer and Knudsen, 2000] P. Niemeyer and J. Knudsen. Curso de Java. Anaya y OReilly, 2000.

25

You might also like