Está en la página 1de 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

iii

Introduccin
1.1 Tipos de datos
1.2 Constantes
1.3 Variables
1.4 Comentarios

1
1
2
2
2

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

3
3
3
3
4
4
4
4
5

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

7
7
8
8
9
9
9
9
9
10
10
10
11
11
12

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

13
13
13
14
14

ii

ndice General

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"

17
17
17
18
18
19
19
19

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

21
21
21
21
22
22

Uso del JDK


7.1 Uso del classpath
7.2 El compilador javac
7.3 El intrprete java

23
23
24
24

Bibliografa

25

Prlogo
A

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

3.4

11

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

7.2

Captulo 7. Uso del JDK

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

También podría gustarte