Vous êtes sur la page 1sur 79

Curso de Iniciacin a Java

Profesor: Csar Vaca Rodrguez Dpto. de Informtica Universidad de Valladolid


http:// www.infor.uva.es/~cvaca

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Distribucin del Curso


n n n n

1 Sesin (15-Mar): Descripcin del lenguaje (I) 2 Sesin (22-Mar): Descripcin del lenguaje (II) 3 Sesin (29-Mar): Programacin en entornos grficos 4 Sesin (5-Abr): Prctica guiada.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Material didctico (CD)


n n n n n n

Kits de desarrollo Java, versiones 1.1.4 y 1.4.0 Entornos de ejecucin, versin 1.4.0 Documentacin de las APIs, versiones 1.1.4 y 1.4.0 Tutorial versin 1.4.0 Especificacin del lenguaje Transparencias en formato PDF

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Descripcin del lenguaje (I)


n Introduccin n Elementos del lenguaje n Arrays n Cadenas de caracteres n Modularidad

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Contexto actual de la tecnologa Java


Estaciones Solaris (UNIX), Internet, desarrollos en C++

1994

1996

2001

Lenguaje Oak
Software universal para electrnica de consumo (televisin interactiva)

Lenguaje Java
Internet Revisin del lenguaje: versines 1.02, 1.1.4, 1.2, 1.3

Tecnologa Java
Redes inalmbricas, telefona movil, computacin distribuida..

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Ejemplo de programa en Java


import java.lang.*; // Esta linea es innecesaria

public class Hola { public static void main(String[] args) { System.out.println("Hola!"); } }


Fichero Hola.java

javac Hola.java java Hola


Compilacin y ejecucin

include <stdio.h>; int main(int argc, char* argv[]) { printf("Hola!/n"); }


Programa equivalente en C

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Objetivo: crear un lenguaje universal


Compilador

Hola.java Hola.java

Hola.class Hola.class

Intrprete

Intrprete

Intrprete

PC Compatible (Windows)

Apple Mac OS/X

Estacin Solaris (Unix)

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Tecnologa Java
n n n n

Controlada por la compaia Sun Microsystems Entorno de desarrollo gratuito: http://www.java.sun.com Entorno de desarrollo: Java Developtment Kit (JDK J2SE) Entorno de ejecucin: Java Runtime Enviroment (JRE)

Mquina virtual Java (JVM) Java Plugin (Mquina virtual universal) Java Hotsopt (Java Web Start) : Ejecucin por red

n n n n n

JINI / JavaSpaces: Entornos de computacin distribuida (agentes) JAIN : Libreras productos telecomunicaciones Servlets : Desarrollo servidores web APIs Especiales: XML, agentes, reconocimiento de voz, grficos 3D... Lenguaje JavaScript

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Caractersticas del lenguaje (I)


n Sintaxis basada en C, con elementos de Pascal y C++ n Sintaxis especial para arrays y strings n Orientado a objetos
n n

Herencia simple con interfaces Existen tipos primitivos

n Multiplataforma (interpretado en destino) n Robusto


n n n

Acceso controlado a memoria y recursos Gestin de errores mediante excepciones Liberacin automtica de memoria (garbage collector)

n Desarrollo de applets

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Caractersticas del lenguaje (II)


n Libreras estandar amplsimas
n n n n n n

Modelo genrico de desarrollo en entornos grficos Multitarea Acceso a bases de datos Acceso a red Computacin distribuida Criptografa, tipos abstractos de datos, compresin de ficheros, tratamiento de grficos, visualizacin en 3D, multimedia, reconocimiento de voz, tecnologa CORBA, XML, etc.

n Posibilidad de integracin de cdigo nativo n Aplicaciones ms lentas que las desarrolladas con C/C++ n Ejecucin dependiente de la mquina virtual (intrprete)
IAESTE/CVR 2003 - Curso de Iniciacin a Java 10

Comparacin con C (I)


n Respecto a la organizacin general de un programa:
n n

No existe preprocesador (macros, #define, ficheros cabecera, ...) No existen funciones independientes ni variables globales todo se encuentra encapsulado en clases. El punto de entrada es una funcin especial de una clase.

n Sintaxis ms regular que en C. Excepciones:


n n n n

Acceso a elementos de array. Inicializacin de arrays y strings. Operador de concatenacin de cadenas Clases internas, sincronizacin de procesos, captura de excepciones.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

11

Comparacin con C (II)


n Respecto a los tipos de datos:
n n

Java dispone de tipos primitivos y clases. No existe definicin de tipos (typedef), estructuras (struct), uniones (union) ni enumeraciones (enum ). Se reemplazan por los conceptos de clase y objeto. No existen modificadores de tamao (short, long, ..) o signo (signed, unsigned). Todos los tipos tienen tamao y longitud definido. Los valores lgicos se representan por un nuevo tipo, boolean, en lugar de por enteros. Los caracteres siguen la convencin Unicode (16 bits). No existen conversiones automticas entre tipos donde se pueda perder informacin.

n n

IAESTE/CVR 2003 - Curso de Iniciacin a Java

12

Comparacin con C (III)


n Punteros y gestin de memoria:
n

En Java no existen punteros. El concepto ms parecido es el de referencia a un objeto. No existe aritmtica de punteros para acceder a elementos de arrays, se utiliza la sintaxis basada en corchetes e ndices. No se reserva memoria para datos (malloc, ..). En su lugar se crean objetos (operador new). No existen punteros a funciones (callbacks). En su lugar se utilizan mtodos de objetos. La liberacin de memoria de datos descartados (free, ..) es automtica (recoleccin de basura garbage collector)

IAESTE/CVR 2003 - Curso de Iniciacin a Java

13

Comparacin con C (IV)


n Estructuras de control:
n

Las condiciones se expresan mediante valores de tipo boolean en lugar de enteros. No hay sentencia goto . Las sentencias break y continue pueden tener una etiqueta para salir de bucles internos.

n n

n Libreras:
n

En java existe un nivel extra de jerarqua: Los paquetes (packages) son colecciones de clases relacionadas, las cuales encapsulan funciones (y datos). La etapa de enlazado (link ) es automtica, y se produce en la compilacin y en la ejecucin.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

14

Sintaxis de Java
n Se distingue entre maysculas y minsculas. n Comentarios tipo C ( /* ... */ ) y de linea ( // ... ) n La ejecucin de un programa tiene como unidad

fundamental la ejecucin de sentencias .


n Las sentencias se agrupan entre llaves { }, y se finalizan

con un punto y coma.


n Tipos de sentencias:
n n n n

Declaracin de variables. Asignacin de variables (con evaluacin de expresiones). Llamadas a funciones (denominados mtodos en Java) Estructuras de control

IAESTE/CVR 2003 - Curso de Iniciacin a Java

15

Tipos de datos primitivos


Nombre byte enteros (signo) (compl. 2) short int long reales float Tamao 8 bits 16 bits 32 bits 64 bits 32 bits 64 bits 16 bits 1 bit Rango -128..127 -32.768..32767 -2109..2109 -91018..91018 -31038..31038 (6 dec) -10308..10308 (15 dec) Codificacin Unicode Valores true/false
16

(IEEE 754) double char boolean


IAESTE/CVR 2003 - Curso de Iniciacin a Java

Operadores (I)
n Operadores aritmticos: devuelven un valor del tipo ms

amplio que intervenga en la expresin.


n n n

El operador / aplicado a enteros devuelve el cociente entero. Si el divisor es 0 se genera una excepcin. El operador / aplicado a reales calcula la divisin real. Si el divisor es 0 el resultado es infinito (no se produce error). El operador % calcula el resto, tanto en enteros como en reales. Para ambos casos se cumple la frmula: r = a % b n Z tal que (0 r < |b|) y (nb + r = a)

IAESTE/CVR 2003 - Curso de Iniciacin a Java

17

Operadores (II)
n Operadores lgicos: admiten valores de tipo boolean (que

expresan condiciones) y devuelven un resultado boolean.

&&

||

n Operadores relacionales: devuelven un valor de tipo boolean

(true o false ).
n n

Al comparar tipos primitivos distintos, se promociona al ms amplio (excepto boolean que slo es compatible con s mismo). Al comparar variables que almacenan referencias a objetos slo tiene sentido los operadores == y !=, y el resultado es el de igualdad de referencias , no el de igualdad de objetos.

==

!=

<

>

<= >=
18

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Operadores (III)
n Operadores de bit: admiten valores de tipo entero y devuelven

un valor del tipo ms amplio utilizado.

&

<< >> >>>

n Operadores de desplazamiento de bits: admiten valores de

tipo entero. El resultado es del mismo tipo que el valor desplazado.


n n n

n << d : Desplaza d posiciones a la izquierda los bits del valor n, rellenando con ceros por la derecha. n >> d : Desplaza d posiciones a la derecha los bits del valor n, rellenando con el bit de signo por la izquierda. n >>> d : Desplaza d posiciones a la derecha los bits del valor n, rellenando con ceros por la izquierda.
19

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Operadores (IV)
n Concatenacin de cadenas: El operador + aplicado dos

parmetros de tipo String crea otro objeto de tipo String que almacena el resultado de concatenar las cadenas.
n Conversin de tipos (casting): Al igual que en C, es posible

forzar a que un valor de un tipo se convierta en el valor de otro tipo distinto, con la construccin (tipo_destino ) expresin.
n

En tipos primitivos no esta permitido convertir un valor boolean en un valor de otro tipo. No se permite la conversin entre tipos primitivos y referencias . La conversin entre referencias tienen restricciones (herencia) que impiden el acceso a zonas de memoria externas a los datos mediante este mecanismo (algo que si es posible en C)

n n

IAESTE/CVR 2003 - Curso de Iniciacin a Java

20

10

Operadores (V)
n Creacin de objetos: El operador new reserva memoria, crea

e inicializa un nuevo objeto pertenenciente a la clase que se indica y utilizando la funcin constructora cuyos parmetros concuerdan con los presentados. La sintaxis es ligeramente distinta con la clase array. new clase(parmetros ) new array[longitud ] Devuelve una referencia (no el propio objeto) al objeto que se acaba de crear.
n Operador ternario: Al igual que C, Java dispone del operador

ternario: condicin ? expresin_cierto : expresin_falso

IAESTE/CVR 2003 - Curso de Iniciacin a Java

21

Operadores (Asignacin)
n Asignacin de variables:

variable = expresin variable op= expresin variable++


n

variable = variable op expresin variable = variable + 1

Se evala la expresin y si el valor es compatible se asigna a la variable, en caso contrario se genera una excepcin. Los tipos primitivos numricos son compatibles si no se pierde informacin al convertir el valor. char es compatible con int. Los tipos primitivos y las referencias a objetos son incompatibles.

n n

IAESTE/CVR 2003 - Curso de Iniciacin a Java

22

11

Declaracin de variables
n Pueden realizarse en cualquier lugar del cdigo. n El mbito de las variables es el del bloque donde han sido

declaradas.
int i=3,j; // Declaracin de i con inicializacin char a; long l=200L; j = (i << 3) & 0xFFFFC000; l *= (i++)%10; // Equivale a: l=l*(i%10); i=i+1; j = (int) l; // Sin casting dara error boolean test; /* La siguiente linea da error al no haber asignado a */ test = a != 'z'; test = test && (i<--j); // Primero decrementa j

IAESTE/CVR 2003 - Curso de Iniciacin a Java

23

Estructuras de control
n Las mismas que en lenguaje C excepto goto (eliminada) y el

manejo de excepciones (incluida).


n Posibilidad de incluir etiquetas en break y continue . bucle1: for(int i=0; i<10; i++) { int j=10,k=0; while((j--) > 0) { switch(j) { case 0: if(i>5) { k++; } else { k--; } break; case 1: continue bucle1; default: k *= 2; } } }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 24

12

Declaracin de funciones
n Sintaxis similar a C, aunque los parmetros se deben definir

obligatoriamente en la cabecera de la funcin.


n Formalmente no existen funciones en Java: Son mtodos de

una clase. En la prctica es suficiente con asumir que no hay funciones aisladas , sino que estan incluidas/asociadas a una clase.
boolean es_primo(int n) { if(n<3) return(true); for(int d=2; d<n; d++) { if(n%d==0) return(false); } return(true); } void contar(int a,int b) { int i=a; do { System.out.println(""+i); } while(i++<b) }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

25

Ejemplo: Clculo de la funcin de Euler


n n n n n

La funcin de Euler del valor entero positivo n nos devuelve el nmero de valores entre 1 y n-1 que son primos respecto a n. La funcin de Euler de 0 y 1 es 1. Un nmero es primo respecto a otro cuando su mximo comn divisor es 1. Para hallar el mximo comn divisor de a y b basta con probar desde min(a,b) hasta 1 parando al encontrar un valor que divida exactamente a y b . Un valor i divide exactamente a n si el resto de dividir n entre i es cero.
java Euler 6 2 java Euler 7 6

public class Euler { public static void main(String[] args) { int n = Integer.parseInt(args[0]); System.out.println(""+euler(n)); } ... }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

26

13

Concepto de Clase
n Generalmente, las funciones definidas en una clase son las que

deben actuan sobre los datos definidos en ella (es decir, existe una conexin conceptual datos- operaciones fundamentales sobre ellos )
n En informtica, este modelo se denomina Tipos Abstractos de

Datos (TADs): No se pueden definir tipos de datos sin hacer referencia a las operaciones que se pueden hacer con ellos.
n Este modelo (y la programacin orientada a objetos es una

extensin suya) aboga por hacer que estas referencias sean explcitas: Los datos deben definirse junto a las operaciones.
n El concepto de clase es una manera de obligar al programador

a seguir este modelo cuando use tipos existentes o defina nuevos tipos de datos en un programa.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

27

Ejemplo: Clase punto - enunciado


n Supongamos que deseamos crear una tipo de datos que

represente un punto bidimensional con coordenadas enteras.


n Las operaciones en las que va a intervenir este tipo de datos en

nuestro programa son:


n n n n n

Calcular la distancia horizontal entre dos puntos. Crear un punto con unas determinadas coordenadas. Crear un punto en el origen. Mover el punto incrementando sus coordenadas Obtener un texto que describa el valor del punto

n En un lenguaje como C, representaramos el punto con un

registro (o un array) y definiramos funciones. Estos elementos pueden estar diseminados en mltiples ficheros.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

28

14

Clase punto versin C (1)


typedef struct { int x,y; } PUNTO; PUNTO* crearPunto(int x0, int y0) { PUNTO* pto = (PUNTO*) malloc(sizeof(PUNTO)); pto->x = x0; pto->y = y0; return(pto); } int disthorz(PUNTO pto1, PUNTO pto2) { return(abs(pto1.xpto2.x)); } void desplazar(PUNTO* pto, int dx, int dy) { pto->x += dx; pto->y += dy; }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

29

Clase punto versin C (II)


PUNTO p1,p2; PUNTO *s1,*s2; int d; p1.x = 1; p1.y = 2; p2 = p1; p2.x = 7; // Afecta este cambio a P1? desplazar(&p2,-1,1); d = disthorz(p1,p2); s1 = crearPunto(1,1); s2 = crearPunto(3,3); s2 = s1; // Que sucede con el punto (3,3)? s2->x = 7; // Afecta este cambio a s1? free(s1); s2->y = 4; // Algn problema?

IAESTE/CVR 2003 - Curso de Iniciacin a Java

30

15

Clase punto versin Java (I)


public class Punto { public int x,y; // Los datos (propiedades)

// Funciones que crean puntos (constructores) Punto() { x = 0; y = 0; } Punto(int x0, int y0) { x = x0; y = y0; } // Funciones que operan sobre el punto (mtodos) public int disthorz(Punto otro) { return(Math.abs(x-otro.x)); } public void desplazar(int dx, int dy) { x += dx; y += dy; } }
Fichero Punto.java

IAESTE/CVR 2003 - Curso de Iniciacin a Java

31

Clase punto versin Java (II)


... Punto s1,s2; int d; s1 = new Punto(); s2 = new Punto(3,3); s2.desplazar(-1,1); d = s1.disthorz(s2); s2 = s1; s2.x = 7; ... ... PUNTO p1,p2; PUNTO *s1,*s2; int d; p1.x = 1; p1.y = 2; p2 = p1; p2.x = 7; desplazar(&p2,-1,1); d = disthorz(p1,p2); s1 = crearPunto(0,0); s2 = crearPunto(3,3); s2 = s1; s2->x = 7; ...

IAESTE/CVR 2003 - Curso de Iniciacin a Java

32

16

Clase punto conclusiones (I)


n Las clases se pueden ver como definir un tipo de datos registro

donde ademas podemos incluir funciones que actuan sobre los campos del registro (en realidad son ms que eso).
n Un objeto es una instancia (materializacin) de una clase. Una

clase es nicamente una definicin, no un valor concreto. Por ejemplo, la palabra entero define un tipo de datos, y los valores 3 y 1 seran instancias de enteros. Se puede asociar tipo de datos clase, valor concreto objeto.
n Cuando se llama a una funcin de un objeto concreto,

implicitamente se asume que se va a realizar una operacin que afecta o en la que interviene el objeto (es un parmetro implcito en la llamada).

IAESTE/CVR 2003 - Curso de Iniciacin a Java

33

Clase punto conclusiones (II)


n Los objetos se crean con el operador new . Al ser creados se

ejecuta una funcin constructora , aquella cuyos parmetros coinciden con los utilizados en la creacin. Las funciones constructoras no tienen nombre.
n El objetivo de las funciones constructoras es inicializar el objeto

con unos valores (estado) determinados.


n Las variables cuyo tipo es una clase no almacenan los

objetos en si mismos, sino una referencia (internamente, un puntero) a ellos.


n El valor devuelto por el operador new es precisamente una

referencia al objeto creado, no el propio objeto.


n Por lo tanto, la asignacin de referencias a objetos se

comportan como la asignacin entre punteros. No se puede asignar directamente un objeto a otro.
IAESTE/CVR 2003 - Curso de Iniciacin a Java 34

17

Un caso especial: Las funciones estticas


n Hay situaciones en las que es dificil aplicar el modelo de

clases/objetos, y es ms natural el modelo de funciones y datos separados de C:


n

Cuando tenemos funciones de propsito general que no tienen una asociacin clara con un tipo de datos concreto (ejemplo, funciones que devuelven informacin sobre el sistema operativo). Conjuntos de funciones que se identifican ms por lo que hacen que por los datos sobre los que actan. Por ejemplo, funciones que hacen clculos matemticos.

n Para estos casos, Java permite definir lo que se denominan

clases estticas funciones estticas :


n n

Su objetivo es agrupar funciones (y datos) bajo un nombre comn No se pueden crear objetos cuyo tipo sea esa clase.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

35

Variables estticas
n Una funcin esttica se declara incluyendo la palabra static en

su cabecera, antes del tipo de retorno. Se asume que la funcin no va a actuar sobre objetos de la clase, sino que se define en ella a efectos de agrupacin con otras funciones relacionadas.
n Anlogamente, tambin es posible definir variables estticas :

datos que no van a estar asociados a un objeto, sino que se incluyen en una clase simplemente para agruparlos bajo el nombre de la clase.
n Al no pertenecer a objetos del tipo de la clases, estos datos son

inmutables: No pueden cambiar su valor.


n Su utilidad por lo tanto, es clara: Las variables estticas

representan el concepto de constante .

IAESTE/CVR 2003 - Curso de Iniciacin a Java

36

18

Ejemplo: La clase Math


n La clase Math de la librera por defecto (java.lang) agrupa

funciones que realizan clculos matemticos y constantes con significado matemtico. Se muestra una parte de su contenido (slo las cabeceras de las funciones):
static double E = 2.718281828459; static double PI = 3.141592653589; static static static static static static static static ... double random() long round(double a) double ceil(double a) double floor(double a) double pow(double base,double exp) double exp(double a) double log(double a) double sqrt(double a)

IAESTE/CVR 2003 - Curso de Iniciacin a Java

37

Ejemplo: La clase System


n La clase System de la librera por defecto (java.lang ) agrupa

funciones relacionadas con el sistema y constantes que representan los ficheros de entrada y salida estandar:
static InputStream in; static PrintStream out; static void arraycopy(Object fnt, int ifnt, Object des, int ides, int n) static long currentTimeMillis() void exit(int status) ...

IAESTE/CVR 2003 - Curso de Iniciacin a Java

38

19

Arrays
n Los arrays son tipos estructurados, y por lo tanto se representan

mediante clases en Java.


n Sin embargo, tienen una sintaxis especial para que su

utilizacin sea parecida a la de C:


n n n

El acceso a elementos se realiza mediante la notacin [indice] Los ndices son enteros y comienzan por 0 Se pueden inicializar directamente

n Diferencias principales:
n

No pueden cambiar de tamao. El nmero de elementos queda fijado en su creacin. Existe un campo, length, con ese valor. Antes del acceso a un elemento, se comprueba internamente si esta en el rango adecuado, en caso contrario se genera una excepcin.
39

IAESTE/CVR 2003 - Curso de Iniciacin a Java

Ejemplo de uso de arrays (I)


int[] cinco; cinco = new int[5]; for(int i=0; i<5; i++) { cinco[i] = i; } char[] diez = {'0','1','2','3','4','5','6','7','8','9'}; int[][] pascal = {{1},{1,1},{1,2,1},{1,3,3,1}}; char[][] cien; cien = new char[10][]; for(int i=0; i<10; i++) { cien[i] = new char[10]; System.arraycopy(diez,0,cien[i],0,10); } cien[5][6] = 'x';

IAESTE/CVR 2003 - Curso de Iniciacin a Java

40

20

Ejemplo de uso de arrays (II)


cien = new char[10][10]; for(int i=0; i<10; i++) { cien[i] = diez; } cien[5][6] = 'x';

double media(double[] vector) { double suma = 0.0; for(int i=0; i<vector.length; i++) { suma += vector[i]; } return(suma/vector.length); }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

41

Cadenas de caracteres
n Las cadenas de caracteres se podran representar como arrays

de valores char (como en C), pero Java define en su librera estandar dos clases que agrupan las principales operaciones que se realizan sobre cadenas de caracteres.
n La clase String (java.lang.String) representa cadenas de

caracteres inmutables (su contenido no va a cambiar).


n La clase StringBuffer (java.lang.StringBuffer) representa

cadenas de caracteres cuyo contenido puede cambiar.


n A diferencia del resto de clases (incuida StringBuffer), la clase

String tiene un tratamiento especial en la sintaxis del lenguaje, para facilitar su uso (este tratamiento especial est tomado del lenguaje Pascal)

IAESTE/CVR 2003 - Curso de Iniciacin a Java

42

21

Sintaxis especial de String


n La sintaxis de Java permite la creacin de objetos de tipo

String sin utilizar new ni llamar a constructores de la clase, basta simplemente con encerrar texto entre comillas dobles.
n Existe el operador + que aplicado a dos objetos de tipo String

crea y devuelve otro objeto de tipo String con la concatencin del contenido de los dos objetos originales.
n Si uno de los argumentos de + es un objeto String y el otro no

(otro tipo de objeto o un valor primitivo), este otro argumento se traduce a texto y se crea un objeto String conteniendo ese texto, que se concatena al objeto String original.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

43

Mtodos principales de String


n Constructores:

String( ) String(byte[] vec) String(char[] vec)


n Mtodos: int length( ) char charAt(int indice)

Cadena vaca Cadena con caracteres de 7 bits Cadena con caracteres Unicode

Longitud de la cadena Carcter en posicin (ndice comienza en 0)

boolean equals(Object cad) Compara para igualdad con cad int compareTo(String cad) int indexOf(String subcad) Compara lexicogrficamente con cad Busqueda de subcadena cad

IAESTE/CVR 2003 - Curso de Iniciacin a Java

44

22

Mtodos principales de String (II)


String concat(String cad) String substring(int i) Crea otra cadena resultado de concatenar el objeto con cad Crea otra cadena que contiene los caracteres desde la posicin i (inclusive) hasta el final.

Crea otra cadena que contiene los caracteres String substring(int ini, int fin) desde la posicin ini (inclusive) hasta la posicin fin (excluido) String toLowerCase( ) String toUpperCase( ) char[] toCharArray( ) Crea otra cadena con los mismos caracteres pero en minsculas. Crea otra cadena con los mismos caracteres pero en maysculas. Crea un vector que contiene los caracteres de la cadena y lo devuelve.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

45

Ejemplos de uso de String


String cad1 = "Hola"; char[] vcad2 = {'H','o','l','a'}; String cad2 = new String(vcad2); if( cad1 == cad2 ) { System.out.println("Esto nunca va a suceder"); } if( cad1.equals(cad2) ) { System.out.println("Esto ya es otra cosa"); } double pi = 3.14159265; System.out.println("Pi = "+pi); System.out.println("Curso Java".substring(6));
IAESTE/CVR 2003 - Curso de Iniciacin a Java 46

23

Modularidad en Java
n En Java un programa consta de una serie de definiciones de

clases. Una de ellas tiene una funcin esttica con la cabecera:


public static void main(String[] args) n Y esta funcin ser el punto de entrada al programa, cuando al

intrprete se le indique que ejecute la clase que la contiene.


n Esta funcin se encargar de ejecutar cdigo, en el cual

seguramente se crearan objetos (tanto definidos por las otras clases del programa como definidos en la librera estandar) y se llamaran a sus mtodos o se accederan a sus propiedades.
n Las clases se agrupan en libreras (denominadas paquetes

(packages) en Java. Las funciones se agrupan en clases.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

47

Modularidad en Java (II)


n Cada definicin de clase debe ir en un fichero separado

(excepto las clases internas ) cuyo nombre (no la extensin) debe ser igual al de la clase.
n Si la clase pertenece a una librera o sublibrera, el fichero que

almacena la clase debe estar en un (sub)directorio cuyo nombre y jerarqua coincide con la de la (sub)librera.
n Por ejemplo, si la clase Punto perteneciara a la sublibrera

geometra de la librera matemticas, su cdigo compilado debera estar en un fichero llamado Punto.class y en el directorio <raizjava>\matemticas \geometra\
n < raizjava> representa el directorio raiz de las clases Java. n El nombre completo de la clase sera

Matemticas.Geometra.Punto
IAESTE/CVR 2003 - Curso de Iniciacin a Java 48

24

Modularidad en Java (III)


n Se permite que existan clases con el mismo nombre siempre

que pertenezcan a libreras distintas (es decir, que su nombre completo sea distinto).
n Si un programa no define libreras, se sobreentiende que las

clases que define pertenecen a lo que se denomina librera local, una librera sin nombre a la que pertenecen todas las clases que estn en el mismo directorio que la que se ejecuta en primer lugar.
n Para no tener que usar nombres completos de clases, es

posible indicar al principio del fichero las clases concretas (o incluso libreras) que se van a usar para que se sobreentienda que el nombre de las clases est abreviado.
import matemticas.geometra.Punto; import java.io.*;
IAESTE/CVR 2003 - Curso de Iniciacin a Java 49

El programa Hola.java revisitado


import java.lang.*; public class Hola { public static void main(String[] args) { System.out.println("Hola!"); } }
Para no tener que escribir java.lang.System.out.println(..) y poder usar todas las clases de la librera java.lang usando sus nombres.

punto de entrada del programa

Clase que almacena datos y funciones de propsito general sobre el sistema

Constante de System que almacena una referencia a un objeto PrintStream (fichero de texto de salida) conectado a la salida estandar del sistema (tipicamente la pantalla)

mtodo de la clase PrintStream cuyo objetivo es escribir una linea de texto en el fichero C: println(out,"Hola!")

objeto de tipo String que se ha creado e inicializado usando la sintaxis abreviada de cadenas de caracteres

IAESTE/CVR 2003 - Curso de Iniciacin a Java

50

25

Prctica propuesta para la sesin (I)


n Crear un programa Java que permita hallar el cambio de un tipo

de moneda a otro.
n Recibe como argumentos una serie de valores de cambios de

monedas, en el formato: moneda 1 cambio12 moneda2 cambio23 moneda3 ...


n Donde monedai es una palabra con el nombre de cada moneda

y cambioi,i+1 es el valor por el que hay que multiplicar para cambiar de monedai a monedai+1
n El programa entra en un bucle el que pregunta de que moneda

a que otra hay que cambiar, pregunta la cantidad de la primera moneda y presenta el cambio.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

51

Prctica propuesta para la sesin (II)


> java Cambio ptas 166.386 euros 1.05 dolares Moneda inicial: [1] ptas [2] euros [3] dolares: 1 Moneda final: [1] ptas [2] euros [3] dolares: 3 ptas? 200 200.00000000 ptas equivalen a 1.14478496 dolares Moneda inicial: [1] ptas [2] euros [3] dolares: 2 Moneda final: [1] ptas [2] euros [3] dolares: 1 euros? 200 200.00000000 euros equivalen a 33277.1999999 ptas Moneda inicial: [1] ptas [2] euros [3] dolares: 0 > _

IAESTE/CVR 2003 - Curso de Iniciacin a Java

52

26

Lectura por teclado


n Las funciones readInt(), readLong(), readDouble(), etc. de la

clase DataInputStream leen datos en formato binario.


n El teclado se define como binario por un fallo de diseo. n En la librera estandar de entrada/salida no existe ninguna

funcin que lea datos en formato texto y realize la traduccin a valores enteros o reales.
n Por lo tanto, para leer de teclado (donde el formato no es

binario, sino texto) la nica alternativa es usar la funcin readLine() de la clase DataInputStream. Esta funcin lee una linea de texto, que luego debe traducirse a los valores apropiados (enteros, reales, etc.)
n Existen funciones para realizar la traduccin, pero un objetivo

de la prctica es que se realice por el propio programa.


IAESTE/CVR 2003 - Curso de Iniciacin a Java 53

Algoritmos
n Conversin de monedas: 200 ptas (/166.386) 1.202024 (/1.05) 1.14478 $
0 1 2

moneda[ ] factor[ ]

Ptas 166.386
0

Euros 1.05
1

Dolares

200 ptas (*166.386) 1.202024 (*1.05) 1.14478 $ n Traduccin de cadena a double: 1


x 100

2
x10

3
x1

4
x0.1

5
x0.01

6
x0.001

IAESTE/CVR 2003 - Curso de Iniciacin a Java

54

27

Descripcin del lenguaje (II)


n Prctica de la sesin anterior n Conceptos de P.O.O. n Tratamiento de excepciones n Libreras bsicas del entorno

IAESTE/CVR 2003 - Curso de Iniciacin a Java

55

Programa Cambio.java (I)


import java.io.*; public class Cambio { public static void main(String[] args) throws IOException { ... } static int traduceAInt(String cad) { ... } static double traduceADouble(String cad) { ... } static int traduceDigito(char dig) { ... } }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

56

28

Programa Cambio.java (II)


public static void main(String[] args) throws IOException { int n = args.length; // Numero de parametros if(n % 2 == 0) { // El numero de parametros no puede ser par System.out.println("Numero de parametros erroneo."); System.exit(0); } // Crea y asigna los vectores que almacenan los nombres // de las monedas y los factores de conversion. String[] moneda; moneda = new String[n/2+1]; for(int i = 0; i < n/2+1; i++) { moneda[i] = args[2*i]; } double[] factor; factor = new double[n/2]; for(int i = 0; i < n/2; i++) { factor[i] = traduceADouble(args[2*i+1]); }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 57

Programa Cambio.java (III)


// Crea linea que muestra los tipos de monedas String lin = ""; for(int i = 0; i < moneda.length; i++) { lin = lin+" ["+(i+1)+"] "+moneda[i]; } // Bucle principal DataInputStream teclado; teclado = new DataInputStream(System.in); do { int m1,m2; double valor1,valor2; System.out.print("Moneda inicial:"+lin+": "); m1 = traduceAInt(teclado.readLine())-1; if(m1 < 0) break; System.out.print("Moneda final: "+lin+": "); m2 = traduceAInt(teclado.readLine())-1;

IAESTE/CVR 2003 - Curso de Iniciacin a Java

58

29

Programa Cambio.java (IV)


System.out.print(""+moneda[m1]+"? "); valor1 = traduceADouble(teclado.readLine()); // Calculo del valor final valor2 = valor1; if(m1 < m2) { for(int i = m1; i < m2; i++) { valor2 /= factor[i]; } } else if(m1 > m2) { for(int i = m1-1; i >= m2; i--) { valor2 *= factor[i]; } } System.out.println(valor1+" "+moneda[m1]+" equivalen a "+ valor2+" "+moneda[m2]+"\n"); } while(true); } // Final de main

IAESTE/CVR 2003 - Curso de Iniciacin a Java

59

Programa Cambio.java (V)


static int traduceDigito(char dig) { return((int) dig-(int) '0'); /* Otra manera switch(dig) case '0': case '1': ... } static int traduceAInt(String cad) { int valor=0, factor=1; for(int i = cad.length()-1; i >= 0; i--) { valor = valor + factor*traduceDigito(cad.charAt(i)); factor *= 10; } return(valor); }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 60

de hacerlo seria: { return(0); return(1); */

30

Programa Cambio.java (VI)


static double traduceADouble(String cad) { // Detecta posicin del punto decimal (si no existe est // implicito al final de la cadena) int posDec = cad.indexOf("."); if(posDec < 0) { posDec = cad.length(); } double valor=0.0, factor; // Acumula la parte entera factor = 1.0; for(int i = posDec-1; i >= 0; i--) { valor = valor + factor*traduceDigito(cad.charAt(i)); factor *= 10.0; } // Acumula la parte decimal factor = 0.1; for(int i = posDec+1; i < cad.length(); i++) { valor = valor + factor*traduceDigito(cad.charAt(i)); factor *= 0.1; } return(valor); }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 61

Revisin de prog. orientada a objetos (I)


n Datos no primitivos (registros, arrays, cadenas de caracteres,

etc.) se representan mediante clases.


n Las funciones se definen en clases:
n

Funciones estticas: las funciones estan asociadas a la clase por motivos de organizacin. Para llamar a una funcin esttica se usa la sintaxis: clase.funcion(parmetros ) Mtodos: se sobreentiende que actuan sobre objetos del tipo de la clase, ya sea cambiando su estado o devolviendo informacin sobre ellos. Llamada a mtodos: objeto.funcion( parametros ) En este ltimo caso es como si el objeto fuera un parmetro ms de la funcin.

n Las variables cuyo tipo es una clase almacenan referencias

(punteros) a objetos.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

62

31

Revisin de prog. orientada a objetos (II)


n Existen funciones constructoras dentro de la clase cuyo objetivo

es inicializar un objeto: Su nombre es igual al de la clase y se diferencian en los parmetros. Se llaman al ejecutar new .
n Los objetos se crean e inicializan utilizando el operador new y

una de las funciones constructoras.


n Nunca se trabaja directamente sobre los objetos sino a traves

de referencias. Por eso no es posible comparar directamente su contenido mediante ==, ni copiar directamente el contenido de un objeto en otro (clonar) mediante =.
n Los datos definidos en una clase son variables globales para

las funciones definidas en la clase: Las funciones pueden actuar directamente sobre ellos.
n Si los datos son estticos, se sobreentiende que son constantes
IAESTE/CVR 2003 - Curso de Iniciacin a Java 63

Definicines y objetivos de la P.O.O. (I)


n Un tipo de datos abstracto (TAD) es una definicin de un tipo de

datos independiente de la implementacin, tan slo se tienen en cuenta las operaciones que se pueden realizar sobre los valores de ese tipo y en como afectan a su estado.
n Una interfaz define un TAD (operaciones) pero sin especificar

su implementacin.
n Una clase define un TAD junto con una implementacin

particular (cmo representar el estado y cmo realizar las operaciones).


n Las clases pueden extender otras clases e implementar

interfaces.
n Una clase que extiende a otra hereda sus datos y operaciones,

y puede definir nuevos datos y operaciones.


IAESTE/CVR 2003 - Curso de Iniciacin a Java 64

32

Definicin y objetivos de la P.O.O. (II)


n Una clase que implementa un interfaz se compromete (contrato)

a implementar las operaciones que se definen en el interfaz.


n Un objeto es una instancia (materializacin) de una clase.

Objetos pertenecientes a una misma clase pueden tener estados distintos.


n No existen operaciones aisladas, sino asociadas a objetos.

Cuando se realiza una operacin se asume que actua sobre el objeto asociado.
n Una variable cuyo tipo sea una clase puede almacenar

referencias a objetos cuyo tipo sea esa clase o cualquier clase que la haya extendido.
n Es decir, que las clases extendidas pueden adoptar la

"personalidad" de la clase original.


IAESTE/CVR 2003 - Curso de Iniciacin a Java 65

Definicin y objetivos de la P.O.O. (III)


n Una variable cuyo tipo sea una interfaz puede almacenar

referencias a objetos cuyo tipo sea cualquier clase que implemente la interfaz.
n La programacin orientada a objetos es una metodologa de

programacin que propugna la representacin de entidades mediante clases, el establecimiento de jerarquias de herencia (extensin) y contrato (implementacin) entre ellas, y la codificacin de programas mediante las interacciones entre objetos.
n Los objetivos son lograr, entre otras cosas:
n n n

Reusabilidad Independencia (Encapsulacin) Coherencia interna


66

IAESTE/CVR 2003 - Curso de Iniciacin a Java

33

Estructura de clases (I)


class Vehiculo { // Propiedades (estado/datos/campos) de la clase public int v1; protected int v2; private int v3; static public int vs; // Constructores de la clase Vehiculo() { .. } Vehiculo(int x) { .. } // Mtodos (operaciones/funciones/codigo) de la clase public void f1() { .. } protected void f2() { .. } private void f3() { .. } static public fs() { .. } }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

67

Estructura de clases (II)


n Las palabras public, protected y private son modificadores de

visibilidad de los datos y las funciones de la clase.


n n n

public implica que se pueden usar en cualquier sitio. protected restringe su uso al interior de clases derivadas private restringe su uso al interior de la propia clase

n La palabra static indica que el dato o la funcin se asocia a la

clase y no a un objeto en particular.


Vehiculo x1,x2; x1 = new Vehiculo(); x1.v1 = 1; x1.v4 = 1; x2 = new Vehiculo(); x2.v1 = 2; x2.v4 = 2; System.out.println(x1.v1+" "+x1.v4+" "+x2.v1+" "+x2.v4); // Resultado: 1 2 2 2 Vehiculo.f1() ; // Erroneo Vehiculo.fs() ; // Correcto x1.f1(); // Correcto x1.fs(); // Permitido pero poco elegante
IAESTE/CVR 2003 - Curso de Iniciacin a Java 68

34

Estructura de clases (III)


class { // // // // // Moto extends Vehiculo Moto hereda todos los datos y cdigo de Vehiculo Conceptualmente Moto es una especializacin de Vehiculo, un tipo particular de Vehiculo. Ademas Moto puede definir nuevos datos y cdigo y cambiar los que posee de Vehiculo

// Los constructores deben definirse (su nombre // est asociado a la clase) pero se pueden usar // los de Vehiculo mediante la palabra super public int v5; // Nuevo dato Moto() { super(); } // Constructor basado en el de Veh. Moto(double d) {..} // Nuevo constructor public void f2() {..} // Metodo redefinido y publicado public void f5() {..} // Nuevo mtodo }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

69

Estructura de clases (IV)


n Las variables de tipo Vehiculo pueden almacenar referencias a

objetos tanto de tipo Vehiculo como de Moto. (toda moto es un vehculo). Sin embargo, las variables de tipo Moto no pueden almacenar referencias de objetos que sean Vehiculo (no todo vehculo es una moto).
n Para saber si una variable almacena un objeto de un tipo

extendido se utiliza el operador instanceof


n Para poder "extraer" un objeto de tipo extendido almacenado en

una variable de un tipo ms general se utiliza el casting. Sin embargo, se debe estar seguro de que el objeto realmente pertenece al tipo al que se va a convertir la referencia.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

70

35

Estructura de clases (V)


// Vector que almacena dos referencias a // vehiculos. Vehiculo[] vec = new Vehiculo[2]; vec[0] = new Vehiculo(); vec[1] = new Moto(); vec[1].f5(); // Error: de vec[1] slo se sabe que // es un vehiculo, no se sabe que es moto. vec[0].f2(); // f2 tal como la define Vehiculo vec[1].f2(); // f2 tal como la redefine Moto! if( vec[1] instanceof Moto ) { ((Moto) vec[1]).f5(); // Correcto } ((Moto) vec[0]).f5(); // Error en ejecucin

IAESTE/CVR 2003 - Curso de Iniciacin a Java

71

Prctica: Cambio orientado a objeto (I)


public class Traductor { static double traduceADouble(String cad) {..} static int traduceAInt(String cad) {..} static int traduceDigito(char dig) {..} } public class Dinero // extends Object { private String[] moneda; // Nombres de monedas private double[][] factor; // factor[i][j] = moneda_i/moneda_j public double valor; // dinero expresado en moneda actual private int monedaAct; // moneda actual public Dinero(String moneda1) { moneda = new String[1]; moneda[0] = moneda1; factor = new double[1][1]; factor[0][0] = 1.0; monedaAct = 0; valor = 0.0; }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 72

36

Prctica: Cambio orientado a objeto (II)


public void setMonedaAct(int n) { valor = factor[n][monedaAct]*valor; monedaAct = n; } public int numMonedas() { return(moneda.length); } public String nombreMoneda() { return(moneda[monedaAct]); } public String nombreMoneda(int i) { return(moneda[i]); }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

73

Prctica: Cambio orientado a objeto (III)


// Clase sobreescrita respecto a Object public String toString() { return(valor+" "+moneda[monedaAct]); } public void nuevaMoneda(String nom, double fac) { // nom: Nombre de la nueva moneda // fac: Una nueva moneda = fac monedas actuales // Ampliamos los arrays creando otros mayores // y copiamos el contenido de los antiguos int n = moneda.length; String[] n_moneda = new String[n+1]; for(int i = 0; i < n; i++) { n_moneda[i] = moneda[i]; } n_moneda[n] = nom;

IAESTE/CVR 2003 - Curso de Iniciacin a Java

74

37

Prctica: Cambio orientado a objeto (IV)


double[][] n_factor = new double[n+1][n+1]; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { n_factor[i][j] = factor[i][j]; } } // Calculamos los factores de conversion de // la nueva moneda al resto, sabiendo que // 1 moneda tipo monedaAct = fac monedas tipo n int a = monedaAct; n_factor[n][n] = 1.0; for(int i = 0; i < n; i++) { n_factor[i][n] = (i == a) ? fac : fac*n_factor[i][a]; n_factor[n][i] = 1.0/n_factor[i][n]; } // Lo nuevos vectores reemplazan a los antiguos moneda = n_moneda; factor = n_factor; } }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 75

Prctica: Cambio orientado a objeto (V)


import java.io.*; public class Cambio { public static void main(String[] args) throws IOException { int n = args.length; // Numero de parametros if(n % 2 == 0) { // El numero de parametros no puede ser par System.out.println("Numero de parametros erroneo."); System.exit(0); } Dinero dinero = new Dinero(args[0]); int monAct = 0; for(int i = 1; i < args.length-1; i+=2) { double fac = Traductor.traduceADouble(args[i]); dinero.setMonedaAct(monAct); dinero.nuevaMoneda(args[i+1],fac); monAct++; }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

76

38

Prctica: Cambio orientado a objeto (VI)


// Crea linea que muestra los tipos de monedas String lin = ""; for(int i = 0; i < dinero.numMonedas(); i++) { lin = lin+" ["+(i+1)+"] "+dinero.nombreMoneda(i); } // Bucle principal DataInputStream teclado; teclado = new DataInputStream(System.in); do { int m1,m2; String res; System.out.print("Moneda inicial:"+lin+": "); m1 = Traductor.traduceAInt(teclado.readLine())-1; if(m1 < 0) break; dinero.setMonedaAct(m1); System.out.print("Moneda final: "+lin+": "); m2 = Traductor.traduceAInt(teclado.readLine())-1; System.out.print(""+dinero.nombreMoneda()+"? "); dinero.valor = Traductor.traduceADouble(teclado.readLine());
IAESTE/CVR 2003 - Curso de Iniciacin a Java 77

Prctica: Cambio orientado a objeto (VII)


res = dinero+" equivalen a "; dinero.setMonedaAct(m2); res = res+dinero; System.out.println(res+"\n"); } while(true); } }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

78

39

Gestin de errores
n Definiremos error como aquella situacin anmala en la que

una funcin no puede realizar su tarea, generalmente porque los parmetros o el entorno tienen unos valores o estados inadecuados: pedir la raiz cuadrada de un nmero negativo, pedir abrir un fichero que no existe, pedir leer de una conexin por red que se acaba de cerrar externamente, etc.
n Es imposible disear las funciones para que puedan trabajar

con todos los valores posibles de los parmetros o del estado. Adems, el que se produzca un error no siempre es sntoma de la existencia de un fallo en el programa (por ejemplo, el cierre de la conexin de red): Simplemente, son situaciones que se deben incorporar a la lgica del programa y disear acciones para tratarlas.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

79

Tcnicas de gestin de errores (I)


n Devolver un valor especial, usar un argumento extra para

indicar un posible error, asignar un valor especial a una variable global


double sqrt(double x) { if(x<0.0) { return( -1.0); } ... } double sqrt(double x, int* error) { if(x<0.0) {*error=1; return(-1);} *error=0; ... } double sqrt(double x) { if(x<0.0) {_merr=1; return(-1);} ... } a = sqrt(b); if(_merr != 0) { ... }

a = sqrt(b); if(a == -1.0) { ... }

a = sqrt(b,&i); if(i != 0) { ... }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

80

40

Tcnicas de gestin de errores (II)


n Terminacin del programa, posiblemente con mensaje de error.

Es decir, obligar a detectar el error antes de llamar a la funcin:


double sqrt(double x) { if(x<0.0) { printf("Error en sqrt!"); exit(-1); } ... }

if(b < 0.0) { ... } else { a = sqrt(b); }

n Blindar el cdigo para que no se produzcan errores. Es decir,

no detectarlos:
double sqrt(double x) { if(x<0.0) { x = -x; } ... }

Imposible detectar error

IAESTE/CVR 2003 - Curso de Iniciacin a Java

81

Tcnicas de gestin de errores (III)


n En general, las libreras implementan de manera heterogenea

cada una de las estrategias anteriores. Los problemas principales son:


n

El cdigo asociado a la deteccin de errores complica y oscurece un programa, hace que sea ms ineficiente (las mismas condiciones son evaluadas dos veces) y estimula el uso de goto para acceder a el cdigo que trata el error. Estas estrategias no obligan al programador a detectar los errores. De hecho, debido a los problemas anteriores, existe una tentacin muy fuerte de suponer que los errores no se van a producir y no crear cdigo para detectarlos ni tratarlos (este enfoque es en s mismo uno de los principales errores de programacin).

IAESTE/CVR 2003 - Curso de Iniciacin a Java

82

41

Solucin: gestin de excepciones


n La gestin de excepciones es una tcnica que intenta resolver

los problemas anteriores.


n Se define un mecanismo nico para la generacin de errores y

para su deteccin.
n Los errores no tienen porque ser detectados y tratados en el

sitio en que se producen: Se permite que se detecten y se traten en el punto que decida el programador. Esto permite el separar el cdigo "normal" (sin errores) del cdigo "reparador" (tratamiento de errores).
n Es posible impedir que el programador ignore ciertos errores,

obligando a que cree cdigo que los trate.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

83

Generacin de excepciones
n Las excepciones (seales de error) se generan en dos pasos,

que tipicamente se unen en una nica sentencia:


n Se crea un objeto que pertenezca a una clase derivada de

Throwable, al cual le podemos dar una cadena de texto informativa del error, y que internamente incluye informacin sobre el punto del programa en que se ha creado.
n Se genera el error con la sentencia throw objeto_Throwable n A partir de ese punto se rompe la secuencia de ejecucin del

programa: Se salta directamente a la parte del cdigo que trata ese error.
n Si la funcin en que se genera el error no tiene cdigo para

tratarlo, se regresa al punto en que fue llamada y se vuelve a generar, y asi hasta que es tratado o se sale del programa.
IAESTE/CVR 2003 - Curso de Iniciacin a Java 84

42

Jerarqua de clases excepciones


Throwable
Throwable() Throwable() Throwable(String Throwable(String mensaje) mensaje) String String getMessage() getMessage() void void printStackTrace() printStackTrace()

Exception

Error

RuntimeException

IAESTE/CVR 2003 - Curso de Iniciacin a Java

85

Tratamiento de excepciones (I)


n Para tratar excepciones se dispone de una estructura de control

especial, la construccin try-catch-finally


try { // Cdigo donde se pueden producir varios errores // de tipos distintos (mediante throw) } catch( Parmetro de tipo1 derivado de Throwable) { // Cdigo que se ejecuta cuando se genera un // error usando un objeto compatible con tipo1 // (es decir, del mismo tipo o uno derivado) } catch( Parmetro de tipo2 derivado de Throwable) { // Cdigo que se ejecuta cuando se genera un // error usando un objeto compatible con tipo2 } finally { // Cdigo que se ejecuta siempre (aunque haya // errores no tratados) }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 86

43

Tratamiento de excepciones (II)


n Las construcciones try-catch-finally pueden anidarse e

incluirse en cualquier otra estructura de control.


n Pueden existir varias (o ninguna) partes catch (tratamiento de

errores). Cuando se produce una excepcin, se va comprobando cada una de ellas secuencialmente hasta detectar una cuyo parmetro sea compatible: En ese punto se ejecuta su cdigo y se salta al punto del programa justo despues de la construccin try-catch (o a la parte finally si existe).
n Slo se ejecutar una de las partes catch (o ninguna), aunque

existan varias con parmetros compatibles: La que est definida primera es la que se ejecuta.
n La parte finally es opcional: Si aparece, se ejecuta siempre,

aunque existan errores no tratados.


IAESTE/CVR 2003 - Curso de Iniciacin a Java 87

Tratamiento de excepciones (III)


n Un error se considera tratado si se ha podido ejecutar el cdigo

de una parte catch. En caso contrario el error "sigue vivo" y se propaga a la funcin que llam aquella donde se ha generado (y no se ha tratado) el error.
n En ltimo trmino, si la funcin main no trata el error, el

programa termina mostrando informacin sobre el error en pantalla.


n El que se ejecute el cdigo de una parte finally no se entiende

como que se ha tratado el error: La finalidad de ese cdigo no es tratar errores, sino asegurar de que ciertas acciones (como cerrar un fichero abierto) se llevan a cabo pase lo que pase.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

88

44

Tipos de excepciones
n En Java se clasifican los errores en tres categoras, que se

detectan dependiendo de que clase derivan:


n Errores "mortales": Aquellos cuyas clases derivan de Error. Son

errores tan serios (inestabilidad del sistema operativo, etc.) que se sobreentiende que es imposible tratarlos. No es obligatorio detectarlos.
n Errores "comunes": Aquellos cuyas clases derivan de Runtime.

Son errores que deberan detectarse y tratarse, pero se refieren a operaciones tan comunes (acceso fuera de ndice en un array, divisin por cero) que obligar a tratarles provocara la rebelin de los programadores. Ademas se sobreentiende que si suceden indican un fallo en el programa.
n Resto de errores: Los que derivan de Exception. Es obligatorio

detectarlos y tratarlos.
IAESTE/CVR 2003 - Curso de Iniciacin a Java 89

Clases comunes
IOException Exception EOFException FileNotFoundException ArithmeticException
ArrayIndexOutOfBoundsException

RuntimeException

StringIndexOutOfBoundsException

ClassCastException ClassNotFoundException
IAESTE/CVR 2003 - Curso de Iniciacin a Java 90

45

Delegacin de tratamiento
n Existe el problema de que es posible que la funcin donde se

genera el error no tenga los medios ni la informacin adecuada para poder tratarlo, lo cual seguramente si que pueda hacer la funcin que la llam, que sabe con qu propsito lo hizo.
n Para manejar estas situaciones, Java permite que las funciones

delegen el tratamiento del error a aquellas otras que la han llamado. Lo nico que deben hacer es declarar en su cabecera aquellos errores cuyo tratamiento es obligatorio que se pueden producir en ellas y que ellas no van a tratar.
n Esa declaracin se realiza aadiendo a la cabecera de la

funcin la palabra reservada throws seguida de una lista de clases derivadas de Exception que representan errores no tratados que se pueden producir.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

91

Practica: Cambio con excepciones (I)


public class TraductorException extends Exception { TraductorException() { super(); } TraductorException(String msg) { super(msg); } } public class Traductor { static double traduceADouble(String cad) throws TraductorException {..} static int traduceAInt(String cad) throws TraductorException {..} static int traduceDigito(char dig) throws TraductorException { int res = (int) dig - (int) '0'; if((res < 0) || (res > 9)) { throw new TraductorException("Formato de numero erroneo!"); } return(res); } }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 92

46

Practica: Cambio con excepciones (II)


import java.io.*; public class Cambio { public static void main(String[] args) { int n = args.length; // Numero de parametros try { if(n%2==0) throw new Exception("N de params erroneo."); Dinero dinero = new Dinero(args[0]); int monAct = 0; for(int i = 1; i < args.length; i+=2) { double fac = Traductor.traduceADouble(args[i]); dinero.setMonedaAct(monAct); dinero.nuevaMoneda(args[i+1],fac); monAct++; } // Crea linea que muestra los tipos de monedas String lin = ""; for(int i = 0; i < dinero.numMonedas(); i++) { lin = lin+" ["+(i+1)+"] "+dinero.nombreMoneda(i); }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 93

Practica: Cambio con excepciones (III)


// Bucle principal DataInputStream teclado; teclado = new DataInputStream(System.in); do { try { int m1,m2; String res; System.out.print("Moneda inicial:"+lin+": "); m1 = Traductor.traduceAInt(teclado.readLine())-1; if(m1 < 0) break; dinero.setMonedaAct(m1); System.out.print("Moneda final: "+lin+": "); m2 = Traductor.traduceAInt(teclado.readLine())-1; System.out.print(""+dinero.nombreMoneda()+"? "); dinero.valor = Traductor.traduceADouble(teclado.readLine()); res = dinero+" equivalen a "; dinero.setMonedaAct(m2); res = res+dinero;

IAESTE/CVR 2003 - Curso de Iniciacin a Java

94

47

Practica: Cambio con excepciones (IV)


System.out.println(res+"\n"); } catch(TraductorException e1) { System.out.println("Datos incorrectos. Tenga mas cuidado!"); } catch(ArrayIndexOutOfBoundsException e2) { System.out.println("Fijese en el rango de las monedas!"); } } while(true); } catch(IOException e3) { System.out.println("Error de teclado!"); } catch(NullPointerException e4) { System.out.println("Error de teclado!"); } catch(Exception e5) { System.out.println(e5); } } }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

95

Libreras bsicas del entorno


lang io util java text net awt
IAESTE/CVR 2003 - Curso de Iniciacin a Java

Clases fundamentales del lenguaje

Ficheros, canales de entrada y salida

Estructuras de datos avanzadas (pilas, tablas hash,..)

Traduccin de datos a texto con formato

Conexiones de red

applet

Programacin en entornos de ventanas

96

48

Librera java.lang (I)


java.lang
Object String StringBuffer System Math
Raiz de la jerarqua de herencia. Mtodos clone(), equals(Object obj), toString() Cadenas de texto de contenido inmutable. Mtodos charAt , length, compareTo, indexOf, substring, valueOf Cadenas con texto variable. Mtodos append , insert, setCharAt , setLength Representa al sistema operativo. Mtodos estticos exit, arrayCopy. Propiedades estticas in, out. Repositorio de constantes y funciones matemticas (mtodos estticos).

IAESTE/CVR 2003 - Curso de Iniciacin a Java

97

Librera java.lang (II)


java.lang
Exception Integer Double Character Cloneable
Clase raiz de la jerarqua de excepciones. Constructor Exception(String msg). Mtodo printStackTrace() Mtodos estticos asociados a enteros. int ParseInt(String num) throws NumberFormatException Mtodos y constantes estticas asociados a reales. Traduccin texto/double: Double.valueOf(cad).doubleValue() Mtodos y constantes estticas asociados a caracteres. digit, isDigit, isLetter, toUpperCase Interfaz para aquellas clases que puedan crear duplicados (clones) suyos.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

98

49

Librera java.io Ficheros de texto (I)

BufferedReader Reader
char char read() read() boolean boolean ready() ready() long long skip(long skip(long n) n) void void close() close() BufferedReader(Reader BufferedReader(Reader r) r) String String readLine() readLine()

FileReader
FileReader(File FileReader(File f) f) FileReader(String FileReader(String fich) fich)

IAESTE/CVR 2003 - Curso de Iniciacin a Java

99

Librera java.io Ficheros de texto (II)


BufferedWriter
BufferedWriter(Writer BufferedWriter(Writer w) w) void void newLine() newLine()

Writer
void void write(char[] write(char[] b) b) void void write(String write(String s) s) void void write(int write(int c) c) void void flush() flush() void void close() close()

PrintWriter
PrintWriter(OutputStream PrintWriter(OutputStream s) s) PrintWriter(Writer PrintWriter(Writer w) w) print(..) print(..) println(..) println(..)

FileWriter
FileWriter(File FileWriter(File f) f) FileWriter(String FileWriter(String fich) fich)
IAESTE/CVR 2003 - Curso de Iniciacin a Java 100

50

Librera java.io Ficheros de datos (I)


DataInputStream
DataInputStream(InputStream DataInputStream(InputStream i) i) int int readInt() readInt()

InputStream
byte byte read() read() int int available() available() long long skip(long skip(long n) n) void void close() close()

int int readUnsignedByte() readUnsignedByte() double double readDouble() readDouble() String String readUTF() readUTF() String String readLine() readLine()

FileInputStream
FileInputStream(File FileInputStream(File f) f) FileInputStream(String FileInputStream(String fich) fich)

IAESTE/CVR 2003 - Curso de Iniciacin a Java

101

Librera java.io Ficheros de datos (II)


BufferedOutputStream
BufferedOutputStream(OutputStream BufferedOutputStream(OutputStream s) s)

OutputStream
void void write(byte[] write(byte[] b) b) void void write(int write(int b) b) void void flush() flush() void void close() close()

DataOutputStream
DataOutputStream(OutputStream DataOutputStream(OutputStream s) s) writeByte(byte writeByte(byte n) n) writeInt(int writeInt(int n) n) writeDouble(double writeDouble(double n) n) writeUTF(String writeUTF(String cad) cad)

FileOutputStream
FileOutputStream(File FileOutputStream(File f) f) FileOutputStream(String FileOutputStream(String fich) fich)
IAESTE/CVR 2003 - Curso de Iniciacin a Java 102

51

Librera java.io Otras clases


Transformar canal de datos a texto:

File
File(String File(String fich) fich) File(File File(File dir, dir, String String fich) fich) boolean boolean delete() delete() boolean boolean renameTo(String renameTo(String s) s) boolean boolean mkdir() mkdir() boolean boolean exists() exists() boolean boolean isDirectory() isDirectory() boolean boolean canRead() canRead() boolean boolean canWrite() canWrite() String[] String[] list() list() String[] String[] list(String list(String comodin) comodin) long long length() length() String String getPath() getPath()
IAESTE/CVR 2003 - Curso de Iniciacin a Java

OutputStreamWriter
OutputStreamWriter(OutputStream OutputStreamWriter(OutputStream s) s)

InputStreamReader
InputStreamReader(InputStream InputStreamReader(InputStream s) s)

Entrada/Salida estandar:

System
in in : : InputStream InputStream out out : : PrintStream PrintStream

IOException

SecurityException
103

Practica: Visualizador de ficheros (I)


import java.io.*; public class Visor { public static void main(String[] args) { File fich1; FileInputStream fich2; DataInputStream fich3; String[] listaFicheros; if(args.length == 0) { System.out.println("No ha indicado el nombre del fichero!"); System.exit(-1); } fich1 = new File(args[0]); if( fich1.isDirectory() ) { listaFicheros = fich1.list(); System.out.println("Contenido del directorio "+args[0]+":"); for(int i = 0; i < listaFicheros.length; i++) { System.out.println(listaFicheros[i]); } } else {
IAESTE/CVR 2003 - Curso de Iniciacin a Java 104

52

Practica: Visualizador de ficheros (II)


// } else { try { fich2 = new FileInputStream(fich1); try { fich3 = new DataInputStream(fich2); System.out.println("Contenido de "+args[0]+":"); while( fich3.available() > 0 ) { String linea; linea = fich3.readLine(); System.out.println(linea); } } finally { fich2.close(); } } catch( FileNotFoundException e1 ) { System.out.println("No existe el fichero <"+args[0]+">"); } catch( IOException e2 ) { System.out.println("Error de lectura: "+e2); } } } }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 105

Librera java.util
java.util
Date Vector Dictionary Locale StringTokenizer
Representa una fecha. El constructor por defecto lo inicializa a la fecha actual. Representa un vector al que se pueden aadir y borrar elementos, acceder por ndice y por valor. Representa una asociacin de pares clave -valor. Permite aadir, borrar, buscar y ordenar por clave. Representa informacin sobre formatos numricos, de fecha y otras convenciones de cada pas. Permite analizar una cadena de texto extrayendo elementos (tokens) segn un formato especificado.
106

IAESTE/CVR 2003 - Curso de Iniciacin a Java

53

Librera java.text (I)


NumberFormat
Creacin: Creacin: NumberFormat NumberFormat nf nf = = NumberFormat.getInstance(); NumberFormat.getInstance(); NumberFormat NumberFormat nf nf = = NumberFormat.getInstance(Locale.FRENCH); NumberFormat.getInstance(Locale.FRENCH); static static Locale[] Locale[] getAvailableLocales() getAvailableLocales() static static NumberFormat NumberFormat getInstance(Locale getInstance(Locale l) l) String String format(double format(double n) n) String String format(long format(long n) n) Number Number parse(String parse(String cad) cad) void void setGroupingUsed(boolean setGroupingUsed(boolean b) b) void void setMaximumFractionDigits(int setMaximumFractionDigits(int d) d) void void setMinimumFractionDigits(int setMinimumFractionDigits(int d) d) void void setMinimumIntegerDigits(int setMinimumIntegerDigits(int d) d)

IAESTE/CVR 2003 - Curso de Iniciacin a Java

107

Librera java.text (II)


DateFormat
Creacin: Creacin: DateFormat DateFormat df df = = DateFormat.getInstance(); DateFormat.getInstance(); DateFormat DateFormat df df = = DateFormat.getInstance(Locale.FRENCH); DateFormat.getInstance(Locale.FRENCH); static static Locale[] Locale[] getAvailableLocales() getAvailableLocales() static static DateFormat DateFormat getInstance(Locale getInstance(Locale l) l) String String format(Date format(Date d) d) Date Date parse(String parse(String cad) cad)

java.util.Locale
String String getDisplayCountry() getDisplayCountry() String String getDisplayVariant() getDisplayVariant()

java.lang.Number
int int intValue() intValue() long long longValue() longValue() double double doubleValue() doubleValue()

IAESTE/CVR 2003 - Curso de Iniciacin a Java

108

54

Librera java.text (III)


MessageFormat
static static String String format(String format(String formato, formato, Object[] Object[] args) args)

n La cadena de formato consiste en texto donde se sustituir

cualquier aparicin de {i,tipo,patrn } por el argumento i-simo ajustado a tipo y formateado segn patrn.
n n n

i es un nmero de 0 a 9 y se refiere al argumento args[i] tipo puede ser: number, time, date o choice Si tipo es number, el patrn es de la forma: ##,##0.## (# - dgito obligatorio excepto cero, 0 dgito obligatorio, coma separador de miles, punto separador de decimales). Si tipo es date o time el patrn puede ser short, medium , long o full.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

109

Practica: Formatos de fecha


import java.text.*; import java.util.*; public class Fechas { public static void main(String[] args) { Locale[] locs = DateFormat.getAvailableLocales(); Date fecha = new Date(); String lin; for( int i = 0; i < locs.length; i++) { System.out.println("Asi lo escriben en"+ locs[i].getDisplayCountry()); DateFormat df = DateFormat.getDateInstance( DateFormat.LONG,locs[i]); System.out.println( df.format(fecha) ); } } }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

110

55

Librera java.net
Socket
Socket(String Socket(String host, host, int int puerto) puerto) InputStream InputStream getInputStream() getInputStream() OutputStream OutputStream getOutputStream() getOutputStream() void void close() close()

ServerSocket
ServerSocket(int ServerSocket(int puerto) puerto) Socket Socket accept() accept() void void close() close()

URL
URL(String URL(String comando) comando) InputStream InputStream openStream() openStream()

IAESTE/CVR 2003 - Curso de Iniciacin a Java

111

Librera java.net Esquema de conexin


Servidor
1. Creacin de socket ServerSocket ServerSocket 2. accept() Socket Socket 3. getInputStream(), getOutputStream() InputStream InputStream OutputStream OutputStream OutputStream OutputStream InputStream InputStream 4. envio de datos 3. getInputStream(), getOutputStream() Socket Socket

Cliente

IAESTE/CVR 2003 - Curso de Iniciacin a Java

112

56

Practica: MiniMini -chat (Servidor) I


import java.io.*; import java.net.*; public class ServidorChat { static int NUMLIN = 23; public static void main(String[] args) { if(args.length == 0) { System.out.println("Uso: java ServidorChat puerto"); System.exit(-1); } // Buffer circular String[] buffer = new String[NUMLIN]; for(int i = 0; i < NUMLIN; i++) buffer[i] = new String(); int inibuf = 0; // Inicia servidor try { int puerto = Integer.parseInt(args[0]); ServerSocket servidor = new ServerSocket(puerto); System.out.println("Servidor instalado en puerto "+puerto);
IAESTE/CVR 2003 - Curso de Iniciacin a Java 113

Practica: MiniMini -chat (Servidor) II


try { // Bucle que procesa (eternamente) peticiones Socket conexion; DataInputStream canalLect; DataOutputStream canalEscr; do { conexion = servidor.accept(); // Procesar peticion try { canalLect = new DataInputStream(conexion.getInputStream()); // Leer nombre y linea de texto String nom = canalLect.readUTF(); String lin = canalLect.readUTF(); // Si la linea esta vacia solo desea obtener buffer if(!lin.equals("")) { String[] lins = formatea(nom,lin); for(int i = 0; i < lins.length; i++) { buffer[inibuf] = lins[i]; inibuf = (inibuf+1)%NUMLIN; } }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

114

57

Practica: MiniMini -chat (Servidor) III


// Enviar buffer canalEscr = new DataOutputStream(conexion.getOutputStream()); for(int i = 0; i < NUMLIN; i++) { canalEscr.writeUTF(buffer[inibuf]); inibuf = (inibuf+1)%NUMLIN; } } catch(IOException e) { // Un error en una peticion se ignora } finally { conexion.close(); } } while(true); } catch(IOException e) { System.out.println("Error del servidor: "+e); } finally { servidor.close(); } } catch(NumberFormatException e1) { System.out.println("Error: N de puerto erroneo."); } catch(IOException e2) { System.out.println("Error al iniciar el servidor: "+e2); } }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 115

Practica: MiniMini -chat (Servidor) IV


public static int min(int a,int b) { return(a < b ? a : b); } public static String[] formatea(String nom, String lin) { int n = 79-nom.length()-2; int m = lin.length(); int l = 1+m/n; String[] lins = new String[l]; lins[0] = nom+": "+lin.substring(0,min(n,m)); String spc = ""; for(int i = 0; i < nom.length()+2; i++) { spc = spc+" "; } for(int i = 1; i < l; i++) { lins[i] = spc+lin.substring(n*i,min(n*(i+1),m)); } return(lins); } }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

116

58

Practica: MiniMini -chat (Cliente) I


import java.io.*; import java.net.*; public class ClienteChat { public static void main(String[] args) { if(args.length < 3) { System.out.println("Uso: java ClienteChat host puerto id"); System.exit(-1); } BufferedReader teclado; teclado = new BufferedReader(new InputStreamReader(System.in)); try { String host = args[0]; int puerto = Integer.parseInt(args[1]); String nombre = args[2]; String separador = ""; for(int i = 0; i < 80; i++) { separador += "-"; }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

117

Practica: MiniMini -chat (Cliente) II


Socket conexion; DataInputStream canalLect; DataOutputStream canalEscr; String linea = ""; do { conexion = new Socket(host,puerto); try { canalEscr = new DataOutputStream(conexion.getOutputStream()); canalEscr.writeUTF(nombre); canalEscr.writeUTF(linea); canalLect = new DataInputStream(conexion.getInputStream()); while(true) { System.out.println(canalLect.readUTF()); } } catch(EOFException e1) { // No se hace nada - Este error debe producirse } catch(IOException e2) { System.out.println("Error de conexion: "+e2); } finally { conexion.close(); }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 118

59

Practica: MiniMini -chat (Cliente) III


System.out.print(separador); System.out.print("Enviar: "); linea = teclado.readLine(); } while(!linea.toUpperCase().equals("FIN")); } catch(NumberFormatException e1) { System.out.println("Error: El puerto debe ser un valor"+ "entre 0 y 9999"); } catch(IOException e2) { System.out.println("Error al iniciar conexion: "+e2); } } }

n Utilizacin del programa:

java ClienteChat odra.dcs.fi.uva.es 6666 nombre

IAESTE/CVR 2003 - Curso de Iniciacin a Java

119

Practica: Cambio con formateo (I)


import java.io.*; import java.text.*; public class Cambio4 { public static void main(String[] args) { int n = args.length; // Numero de parametros try { if(n%2 == 0) throw new Exception("N de param. erroneo."); Dinero dinero = new Dinero(args[0]); int monAct = 0; for(int i = 1; i < args.length-1; i+=2) { double fac = NumberFormat.getInstance().parse(args[i]).doubleValue(); dinero.setMonedaAct(monAct); dinero.nuevaMoneda(args[i+1],fac); monAct++; }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

120

60

Practica: Cambio con formateo (II)


// Crea linea que muestra los tipos de monedas String lin = ""; for(int i = 0; i < dinero.numMonedas(); i++) { lin = lin+" ["+(i+1)+"] "+dinero.nombreMoneda(i); } // Bucle principal InputStreamReader temp = new InputStreamReader(System.in); BufferedReader teclado = new BufferedReader(temp); String cadLect = "{0,number} {1,number} {2,number}"; String cadEscr = "{0,number,#,##0.###} {2} equivalen a "+ "{1,number,#,##0.###} {3}.\n"; MessageFormat lect = new MessageFormat(cadLect); Object[] vLect; do { try { int m1,m2; double valor; System.out.println("Codigo de monedas: "+lin); System.out.print("Introduzca moneda inicial, "+ "final y cantidad: ");
IAESTE/CVR 2003 - Curso de Iniciacin a Java 121

Practica: Cambio con formateo (III)


vLect = lect.parse( teclado.readLine() ); m1 = ((Number) vLect[0]).intValue()-1; m2 = ((Number) vLect[1]).intValue()-1; valor = ((Number) vLect[2]).doubleValue(); if(m1 < 0) break; dinero.setMonedaAct(m1); dinero.valor = valor; dinero.setMonedaAct(m2); Object[] vEscr = {new Double(valor), new Double(dinero.valor), dinero.nombreMoneda(m1), dinero.nombreMoneda() }; System.out.println(MessageFormat.format(cadEscr,vEscr)); } catch(ParseException e1) { System.out.println("Formato de datos incorrecto: "+ "Separe los valores por espacios y escriba los datos"+ "con el formato de su idioma local."); } catch(ArrayIndexOutOfBoundsException e2) { ...

IAESTE/CVR 2003 - Curso de Iniciacin a Java

122

61

Entornos de ventanas
n Conceptos fundamentales n Programacin orientada a eventos n Clases fundamentales n Aplicaciones y Applets

IAESTE/CVR 2003 - Curso de Iniciacin a Java

123

Programacin en entorno de ventanas


n

Interaccin con el usuario


n

La lectura de datos y la peticin de acciones se realizan mediante controles agrupados en ventanas (Interfaz grfica). Es el usuario quien dirige la entrada de datos, en lugar de la aplicacin. Existen dispositivos de entrada adicionales (ratn). Toda aplicacin consta de una ventana principal y varias ventanas adicionales (dilogos).

n n

Procesamiento de los datos


n

El cdigo no es monoltico, est dividido en partes que se encargan de procesar cada evento relevante para la aplicacin. Es el sistema operativo quien se encarga de ejecutar el cdigo asociado a cada evento de cada aplicacin.
124

IAESTE/CVR 2003 - Curso de Iniciacin a Java

62

Interfaz grfica de usuario


n n n n

Controles (componentes): Entrada de datos y peticin de realizacin de acciones. Contenedores: Agrupan controles (y otros contenedores). Distribuidores (layouts): Organizan la posicin y tamao de los controles dentro de un contenedor, de acuerdo a unas reglas. Ventanas: Contenedores de nivel superior, que representan a la aplicacin.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

125

Programacin orientada a eventos


n Las aplicaciones orientadas a ventanas organizan el cdigo en

dos partes separadas: Una se encarga de crear el interfaz de usuario (al comenzar la aplicacin) y la otra de realizar las tareas adecuadas respondiendo a las acciones del usuario (manejador de eventos).
n Las aplicaciones indican al sistema operativo cual es su

ventana principal y le proporcionan el manejador de eventos.


n Cuando el sistema operativo detecta una accin del usuario

(evento), busca la aplicacin a la que va dirigida el evento (de entre todas las que se esten ejecutando) y llama a su manejador de eventos.
n El manejador de eventos ejecuta el cdigo asociado. Cuando

termina, la aplicacin queda en suspenso hasta la llegada del siguiente evento


IAESTE/CVR 2003 - Curso de Iniciacin a Java 126

63

Ejemplo: Ventana mnima


import java.awt.*; public class EjemploVentana { public static void main(String[] args) { Frame ventana = new Frame("Mini-Ventana"); Button boton = new Button("Pulsame!"); FlowLayout distribuidor = new FlowLayout(FlowLayout.CENTER); ventana.setLayout(distribuidor); ventana.add(boton); ventana.setSize(300,200); ventana.show(); } }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

127

Modelos de programacin (I)


n

AWT (abstract windows toolkit)


n

Los componentes son los del sistema operativo (se enlazan mediante cdigo nativo) El look de una aplicacin es el mismo que el del sistema operativo donde se ejecuta El conjunto de componentes y recursos disponibles es aquel que sea comn a todos los sistemas operativos

IAESTE/CVR 2003 - Curso de Iniciacin a Java

128

64

Modelos de programacin (II)


n

SWING (librera javax.swing)


n n

Los componentes son independientes del sistema operativo. El look de una aplicacin es el mismo en todos los sistemas operativos. El conjunto de componentes y recursos disponibles puede ser ms amplio que los que proporciona el sistema operativo.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

129

Modelos de programacin (III)


n

Gestin monoltica de eventos


n

Todos los eventos se gestionan de forma nica en la funcin handleEvent de la ventana principal. Esta funcin se llama para cada evento que se produce, sea relevante o no para la aplicacin. Este era el modelo original de Java, actualmente se soporta pero se desaconseja su uso (deprecated ).

Gestin distribuida de eventos


n

La aplicacin proporciona cdigo para aquellos eventos que le interesan. El resto de eventos no se proporcionan a la aplicacin. Apareci en la versin 1.1.2. Requiere el uso de clases internas .

IAESTE/CVR 2003 - Curso de Iniciacin a Java

130

65

Ejemplo: MiniMini - Ventana (I)


n Clase "lanzadora" de la ventana: (lo habitual es incluir la funcin

main en la clase que extiende a Frame y representa la ventana principal)


public class EjemploVentana2 { public static void main(String[] args) { MiniVentana ventana = new MiniVentana("Mini-Ventana"); ventana.creaControles(); ventana.setSize(300,200); ventana.show(); } }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

131

Ejemplo: MiniMini - Ventana (III)


n Clase que extiende a la ventana por defecto (Frame):
import java.awt.*; public class MiniVentana extends Frame { Button boton; public MiniVentana( ) { super(); } public MiniVentana(String titulo) { super(titulo); } // Creacin del interfaz de usuario public void creaControles() { boton = new Button("Pulsame!"); FlowLayout distribuidor = new FlowLayout(FlowLayout.CENTER); setLayout(distribuidor); add(boton); }

IAESTE/CVR 2003 - Curso de Iniciacin a Java

132

66

Ejemplo: MiniMini - Ventana (IV)


n Manejador de eventos:
public boolean handleEvent(Event evt) { switch( evt.id ) { case Event.ACTION_EVENT: if( evt.target == boton ) { if( boton.getLabel().equals("Pulsame!") ) { boton.setLabel("Ya es suficiente!"); doLayout(); } else { boton.setEnabled(false); } return(true); } break; case Event.WINDOW_DESTROY: dispose(); System.exit(0); return(true); } System.out.println(evt); return(false); } }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 133

Jerarqua de herencia del AWT (I)


Component

Label Checkbox

Canvas

Button

Container

Choice

List Scrollbar

Panel

Window

TextComponent

Applet

Dialog

Frame

TextField

TextArea

FileDialog

IAESTE/CVR 2003 - Curso de Iniciacin a Java

134

67

Jerarqua de herencia del AWT (II)


MenuComponent LayoutManager

MenuItem

MenuBar

FlowLayout BorderLayout

Menu

CheckboxMenuItem GridLayout

PopupMenu

CardLayout
Distribuidores

Mens

IAESTE/CVR 2003 - Curso de Iniciacin a Java

135

Otras clases del AWT


Event Cursor Font Graphics Dimension Image Color Toolkit
Tipos bsicos Otros elementos del entorno

Point Rectangle Insets

CheckboxGroup FontMetrics

Tipos auxiliares

IAESTE/CVR 2003 - Curso de Iniciacin a Java

136

68

Ejemplo de uso de las clases

Ficheros VentComponentes.java y MiCanvas.java

IAESTE/CVR 2003 - Curso de Iniciacin a Java

137

Componentes (I)
Component
void void add(PopupMenu add(PopupMenu menu) menu) Image Image createImage(int createImage(int ancho, ancho, int int alto) alto) void void doLayout() doLayout() void void repaint() repaint() void void setBackground(Color setBackground(Color fondo) fondo) void void setForeground(Color setForeground(Color motivo) motivo) void void setCursor(Cursor setCursor(Cursor cursor) cursor) void void setFont(Font setFont(Font fuente) fuente) void void setEnabled(boolean setEnabled(boolean activo) activo) void void setVisible(boolean setVisible(boolean visible) visible) Cada funcin que comienza por set tiene la correspondiente funcin get que devuelve el valor actual de la propiedad.

Component
Dimension Dimension getMinimumSize() getMinimumSize() Dimension Dimension getPreferredSize() getPreferredSize() boolean boolean handleEvent(Event handleEvent(Event evt) evt) void void paint(Graphics paint(Graphics g) g) Mtodos que no se deben llamar, sino reemplazar por clases que hereden de Componente. Definen la apariencia y la respuesta a eventos de nuevos componentes.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

138

69

Componentes (II)
Label
static static int int LEFT LEFT static static int int CENTER CENTER static int RIGHT static int RIGHT Label Label(String (String texto, texto, int int alineacion) alineacion) String String getText() getText() void void setText(String setText(String texto) texto)

Canvas
Dimension Dimension getMinimumSize() getMinimumSize() Dimension Dimension getPreferredSize() getPreferredSize() void void paint(Graphics paint(Graphics g) g)

Eventos
Event.MOUSE_DOWN Event.MOUSE_DOWN Event.MOUSE_MOVE Event.MOUSE_MOVE Event.MOUSE_DRAG Event.MOUSE_DRAG

Eventos
<ninguno> <ninguno>

IAESTE/CVR 2003 - Curso de Iniciacin a Java

139

Componentes (III)
Button
Button(String Button(String texto) texto) void void setLabel(String setLabel(String texto) texto)

MenuItem
MenuItem(String MenuItem(String texto) texto) void void setLabel(String setLabel(String texto) texto)

Eventos
Event.ACTION_EVENT Event.ACTION_EVENT

Eventos
Event.ACTION_EVENT Event.ACTION_EVENT

CheckboxMenuItem
CheckboxMenuItem(String CheckboxMenuItem(String texto, texto, boolean boolean estado) estado) void void setState(boolean setState(boolean estado) estado)

Eventos
Event.ACTION_EVENT Event.ACTION_EVENT

IAESTE/CVR 2003 - Curso de Iniciacin a Java

140

70

Componentes (IV)
Checkbox
Checkbox(String Checkbox(String texto, texto, boolean boolean estado) estado) Checkbox(String Checkbox(String texto, texto, boolean boolean estado, estado, CheckBoxGroup CheckBoxGroup grupo) grupo) void void setLabel(String setLabel(String texto) texto) void void setState(boolean setState(boolean estado) estado)

Eventos
Event.ACTION_EVENT Event.ACTION_EVENT

CheckboxGroup
CheckboxGroup CheckboxGroup() ()

Checkbox sin grupo asociado Tres Checkbox asociados al mismo objeto CheckboxGroup

IAESTE/CVR 2003 - Curso de Iniciacin a Java

141

Componentes (IV)
Choice
Choice() Choice() void void addItem(String addItem(String texto) texto) int int getItemCount() getItemCount() String String getItem(int getItem(int indice) indice) int int getSelectedIndex() getSelectedIndex() String String getSelectedItem() getSelectedItem() void void select(int select(int indice) indice) void void insert(String insert(String texto, texto, int int indice) indice) void void remove(int remove(int index) index) void void removeAll() removeAll()

NullPointerException

IllegalArgumentException

Eventos
Event.ACTION_EVENT Event.ACTION_EVENT

IAESTE/CVR 2003 - Curso de Iniciacin a Java

142

71

Componentes (V)
List
List(int List(int numFil, numFil, boolean boolean multipleSel) multipleSel) void void addItem(String addItem(String texto) texto) int int getItemCount() getItemCount() String String getItem(int getItem(int indice) indice) int[] int[] getSelectedIndexes() getSelectedIndexes() boolean boolean isIndexSelected(int isIndexSelected(int indice) indice) void void select(int select(int indice) indice) void void deselect(int deselect(int indice) indice) void void removeAll() removeAll() void void makeVisible(int makeVisible(int indice) indice)

NullPointerException

IllegalArgumentException

Eventos
Event.LIST_SELECT Event.LIST_SELECT Event.LIST_DESELECT Event.LIST_DESELECT
IAESTE/CVR 2003 - Curso de Iniciacin a Java 143

Componentes (VI)
TextComponent
String String getText() getText() void void setText(String setText(String texto) texto) void void setEditable(boolean setEditable(boolean ed) ed) String String getSelectedText() getSelectedText()

TextField
TextField(String TextField(String texto, texto, int int numCol) numCol)

TextArea
static static int int SCROLLBARS_BOTH SCROLLBARS_BOTH static static int int SCROLLBARS_NONE SCROLLBARS_NONE TextArea(String TextArea(String texto, texto, int int numFil, numFil, int int numCol, numCol, int int sbVis) sbVis) void void append(String append(String text) text)

Eventos
Event.ACTION_EVENT Event.ACTION_EVENT Event.KEY_PRESS Event.KEY_PRESS Event.KEY_RELEASE Event.KEY_RELEASE

IAESTE/CVR 2003 - Curso de Iniciacin a Java

144

72

Contenedores (I)
Container
add(Component add(Component c) c) add(String add(String zona, zona, Component Component c) c) void void setLayout(LayoutManager setLayout(LayoutManager distr) distr) void void doLayout() doLayout() Insets Insets getInsets() getInsets() Funcin para aadir componentes cuando el distribuidor es BorderLayout o CardLayout. En el primer caso, zona debe ser "North ", "South ", "East", "West" o "Center " (Nota: La primera letra mays cula y el resto minsculas, sino se genera un error) Funcin para aadir componentes cuando el distribuidor es FlowLayout o GridLayout

Panel
Panel Panel() () Panel Panel(LayoutManager (LayoutManager distr) distr) void void paint(Graphics paint(Graphics g) g)

IAESTE/CVR 2003 - Curso de Iniciacin a Java

145

Contenedores (II)
Frame
Frame(String Frame(String titulo) titulo) void void show() show() void void dispose() dispose() void void setTitle(String setTitle(String titulo) titulo) void void setMenuBar(MenuBar setMenuBar(MenuBar barra) barra) void void setIconImage(Image setIconImage(Image icono) icono) boolean boolean handleEvent(Event handleEvent(Event evt) evt)

Dialog
Dialog Dialog(String (String titulo, titulo, Frame Frame vent, vent, boolean boolean modal) modal) void void show() show() void void dispose() dispose() void void setTitle(String setTitle(String titulo) titulo) boolean boolean handleEvent(Event handleEvent(Event evt) evt)

Eventos
Event.WINDOW_DESTROY Event.WINDOW_DESTROY Event.WINDOW_ICONIFY Event.WINDOW_ICONIFY Event.WINDOW_DEICONIFY Event.WINDOW_DEICONIFY Event.WINDOW_EXPOSE Event.WINDOW_EXPOSE

Eventos
Event.WINDOW_DESTROY Event.WINDOW_DESTROY Event.WINDOW_ICONIFY Event.WINDOW_ICONIFY Event.WINDOW_DEICONIFY Event.WINDOW_DEICONIFY Event.WINDOW_EXPOSE Event.WINDOW_EXPOSE

IAESTE/CVR 2003 - Curso de Iniciacin a Java

146

73

Contenedores (III)
MenuBar
MenuBar MenuBar() () add(Menu add(Menu menu) menu) setHelpMenu(Menu setHelpMenu(Menu menu) menu)

Menu
Menu(String Menu(String nombre) nombre) add(MenuItem add(MenuItem elem) elem) add(Menu add(Menu submenu) submenu)

PopupMenu
PopupMenu(String PopupMenu(String nombre) nombre) add(MenuItem add(MenuItem elem) elem) add(Menu add(Menu submenu) submenu) show(Component show(Component c, c, int int x, x, int int y) y)

IAESTE/CVR 2003 - Curso de Iniciacin a Java

147

Distribuidores
FlowLayout
static static int int CENTER CENTER static static int int LEFT LEFT static static int int RIGHT RIGHT FlowLayout(int FlowLayout(int alin,int alin,int espX, espX, int int espY) espY)

BorderLayout
FlowLayout(int FlowLayout(int espX, espX, int int espY) espY)

GridLayout
GridLayout(int GridLayout(int numFil, numFil, int int numCol, numCol, int int EspX, EspX, int int EspY) EspY)

IAESTE/CVR 2003 - Curso de Iniciacin a Java

148

74

Contenedores y distribuidores
GridLayout(1,4,5,5)

FlowLayout(FlowLayout.CENTER,10,10) BorderLayout(0,10)

BorderLayout(0,0)
IAESTE/CVR 2003 - Curso de Iniciacin a Java

GridLayout(6,1,0,0)
149

Otros elementos (I)


Graphics
void void setColor(Color setColor(Color col) col) void void setFont(Font setFont(Font fnt) fnt) void void drawLine(int drawLine(int x1, x1, int int y1, y1, int int x2, x2, int int y2) y2) void void drawRect(int drawRect(int x0, x0, int int y0, y0, int int lx, lx, int int ly) ly) void void fillRect(int fillRect(int x0, x0, int int y0, y0, int int lx, lx, int int ly) ly) void void drawString(String drawString(String lin, lin, int int x, x, int int y) y) FontMetrics FontMetrics getFontMetrics() getFontMetrics() void void setPaintMode() setPaintMode() void void setXORMode() setXORMode()

Color
static static int int white white static static int int black black static static int int blue blue static static int int red red ... ... Color Color(float (float r, r, float float g, g, float float b) b)

Font
static static int int BOLD BOLD static static int int ITALIC ITALIC static int PLAIN static int PLAIN Font(String Font(String nom, nom, int int estilo, estilo, int int tam) tam)

FontMetrics
int int getHeight() getHeight() int int stringWidth(String stringWidth(String lin) lin)
IAESTE/CVR 2003 - Curso de Iniciacin a Java

Nombres universales: "Serif", "SansSerif", "Monospaced ".


150

75

Otros elementos (II)


Toolkit
String[] String[] getFontList() getFontList() Image Image getImage(String getImage(String nomFich) nomFich) Image Image getImage(URL getImage(URL dir) dir)

Event
static static int int ACTION_EVENT ACTION_EVENT static static int int KEY_PRESS KEY_PRESS static static int int KEY_RELEASE KEY_RELEASE static static int int LIST_SELECT LIST_SELECT static static int int LIST_DESELECT LIST_DESELECT static static int int MOUSE_DOWN MOUSE_DOWN static static int int MOUSE_MOVE MOUSE_MOVE static static int int MOUSE_DRAG MOUSE_DRAG static static int int WINDOW_DESTROY WINDOW_DESTROY int int id id // // Tipo Tipo de de mensaje mensaje

Insets
int int bottom, bottom, int int top top int int left, left, int int right right Insets(int Insets(int t, t, int int l, l, int int b, b, int int r) r)

int int x, x, int int y y // // Coordenadas Coordenadas ratn ratn

Dimension
int int height height int int width width Dimension(int Dimension(int w, w, int int h) h)

int int key key

// // Tecla Tecla pulsada pulsada

Object Object target target // // Componente Componente

IAESTE/CVR 2003 - Curso de Iniciacin a Java

151

Applets
n Los applets son mini-aplicaciones incrustadas en una pgina

web, ejecutadas por la mquina virtual Java asociada al navegador que visualiza la pgina.
n Estas aplicaciones se descargan junto con la pgina en formato

de ficheros compilados (.class) y se ejecutan en el cliente, no en el servidor.


n La clase principal debe ser una extensin de la clase Applet y

por lo tanto es un Panel , no una ventana. Este panel tiene asignados una posicin y dimensiones dentro del documento.
n Los applets tienen unas restricciones de seguridad muy

estrictas: no pueden acceder a los recursos de la mquina cliente (en concreto al sistema de ficheros) y solo pueden establecer conexiones de red con el servidor de la pgina.

IAESTE/CVR 2003 - Curso de Iniciacin a Java

152

76

Anatoma de un Applet
n Para crear un applet, se debe crear una clase que extienda a

java.applet.Applet (nota: la clase Applet no est situada en la librera awt, sino en la librera applet) y sobreescribir alguno (o todos) de las siguientes funciones:
n void init(): Esta funcin se llama cuando se acaba de cargar el

applet en el navegador. Aqu se debe incluir el cdigo que crea la interfaz de usuario.
n boolean handleEvent(Event evt): Aqu se incluye el cdigo de

procesado de eventos.
n void start(): Esta funcin se llama cuando el applet pasa a

estar visible en la pgina.


n void stop(): Esta funcin se llama cuando el applet ya no es

visible en la pgina.
IAESTE/CVR 2003 - Curso de Iniciacin a Java 153

La clase Applet
Applet
void void init() init() void void start() start() void void stop() stop() void void destroy() destroy() boolean boolean handleEvent(Event handleEvent(Event evt) evt) void void paint(Graphics paint(Graphics g) g) Image Image getImage(URL getImage(URL dir) dir) void void play(URL) play(URL) String String getParameter(String getParameter(String nombre) nombre)

n Los applets no se crean

explcitamente
n Los applets no tienen como

punto de entrada main


n Los applets no se ejecutan con el

intrprete java
n Se incluyen en el cdigo de una

pgina web y se ejecutan al cargar la pgina con un navegador o la herramienta appletviewer

IAESTE/CVR 2003 - Curso de Iniciacin a Java

154

77

Ejemplo de applet (I)


import java.awt.*; import java.applet.*; public class EjemploApplet extends Applet { Button boton; public void init() { boton = new Button("Pulsame!"); setLayout( new FlowLayout(FlowLayout.CENTER) ); add(boton); } public boolean handleEvent( Event evt ) { if( evt.id == Event.ACTION_EVENT ) { VentComponentes vent = new VentComponentes("Hola"); vent.creaControles(); vent.setSize(400,300); vent.show(); return(true); } return(false); } }
IAESTE/CVR 2003 - Curso de Iniciacin a Java 155

Ejemplo de applet (II)


n Pgina web:
<HTML> <HEAD><TITLE>Ejemplo de Applet</TITLE></HEAD> <BODY> <H1>Ejemplo de Applet</H1> <P>El recuadro de abajo es un applet:</P> <APPLET CODE="EjemploApplet.class" WIDTH="150" HEIGHT="100"> </APPLET> <P>Aqui sigue el resto del documento</P> </BODY> </HTML>
Fichero pagina.html

n Ejecucin:
explorer pagina.html navigator pagina.html appletviewer pagina.html

IAESTE/CVR 2003 - Curso de Iniciacin a Java

156

78

Prcticas guiadas (ltima sesin)


n n

Modificar el visor de ficheros y directorios adaptndolo a una aplicacin de ventanas. Modificar el conversor de moneda convirtindolo en un applet. Instalacin y uso del entorno Java:
n Es necesario fijarse en el directorio en que se instala el

entorno. Suele ser c:\jdk1.4.0 (la versin cambia).


n Los programas javac, java y appletviewer se

encuentran en el subdirectorio bin (aadirlo al PATH)


n El entorno y la documentacin suelen proporcionarse

por separado.
IAESTE/CVR 2003 - Curso de Iniciacin a Java 157

79

Vous aimerez peut-être aussi