Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sánchez
PROGRAMACION EN JAVA
Esta pequeña introducción al lenguaje Java está pensada para estudiantes que están
cursando la asignatura de Programación Concurrente en el tercer curso de las
titulaciones I.I., I.T.I.S. e I.T.I.G. en la Escuela Politécnica de la UEX y a los que se les
presupone conocimientos de C++ o, en general, de Programación Orientada a Objetos.
La mayoría del material aquí expuesto ha sido sacado de varios libros, tutoriales de
Internet y un curso de postgrado sobre el lenguaje Java impartido en la UEX en el curso
99/00. Todos ellos son citados en la Bibliografía de la asignatura disponible en
http://webepcc.unex.es/fernando/concurrente.htm
Introducción
Un poco de historia
Java surgió como resultado de la búsqueda de un lenguaje para programar dispositivos
electrónicos de bajo precio. Este tipo de dispositivos tienen como principales requisitos:
alto grado de portabilidad puesto que los chips cambian frecuentemente y una alta
confiabilidad pues a veces hay que controlar sistemas críticos. Por su parte, un equipo
de trabajo en Sun MicroSystems, liderado por James Gosling, trataba de desarrollar un
nuevo lenguaje de programación sencillo y portable a cualquier entorno de ejecución.
Su primer resultado fue el lenguaje Oak. Era un lenguaje de programación moderno y
potente, eliminando lo innecesario y las fuentes habituales de errores que presentaban
otros lenguajes como C ó C++.
Por problemas en el copyright del lenguaje, Oak tuvo que ser rebautizado como Java.
Concurrentemente en el tiempo (años 90) aparece la World Wide Web en Internet para
acceder con una interfaz gráfica a información en todo el mundo mediante navegadores.
El equipo de Gosling integró Java en un navegador para poder ejecutar los programas
escritos en Java desde cualquier entorno. Así surgió HotJava, un navegador que podía
ejecutar un programa escrito en Java que estuviese en cualquier lugar de la red.
El entorno de desarrollo.
Sun Microsystems proporciona un entorno no visual de desarrollo de forma totalmente
gratuita, lo que es conocido como JDK (Java Development Kit). Existen varias
versiones que han ido incorporando nuevas características a lo largo del tiempo. Aquí
siempre se hará referencia a la versión 1.2.2. que es con la que se trabajará en las clases
prácticas.
Aparte de este JDK, distintas compañías de software han lanzado sus propios entornos
de desarrollo integrados basados en el JDK de Sun, aunque no todas pues como suele
ser habitual Microsoft va por otro lado y tiene su propio JDK no siempre compatible
con el de Sun.
Se pueden destacar:
Nombre Fabricante
JBuilder (Borland)
Visual J ++ (Microsoft)
Java Workshop (Sun)
Visual Café (Symantec)
01/03/2002 1/24
Programación Concurrente – Introducción a Java F. Sánchez
Introducción al lenguaje
Java es un lenguaje orientado a objetos donde todo son clases excepto algunos tipos
primitivos básicos. Sus principales características son:
Orientado a objetos.
Flexible, modular, reutilizable.
Bibliotecas con tipos básicos, I/O, GUI, comunicaciones.
Sencillo, pequeño y simple (hasta cierto punto)
Robusto, potente y flexible.
Gestión automática de memoria.
Independiente de la plataforma hardware.
Multithreaded (multihilo).
Código fuente
javac (compilación)
Bytecodes
java (interpretación)
EJECUCIÓN
Figura 1. Proceso de compilación e interpretación en Java
01/03/2002 2/24
Programación Concurrente – Introducción a Java F. Sánchez
Aparte de esta portabilidad, Java también destaca por su soporte multihilo y capacidades
para trabajar con objetos distribuidos e Internet. Precisamente el soporte multihilo es lo
que nos interesa para nuestra asignatura de Programación Concurrente. Sin embargo,
antes de introducirnos con la programación multihilo o multithreading en Java haremos
un breve resumen de las principales características del lenguaje. En primer lugar
veremos un sencillo programa y aprenderemos a compilarlo y ejecutarlo. Seguidamente
se mostrará la sintaxis básica del lenguaje, las clases, la herencia, el polimorfismo, los
interfaces, los paquetes, las excepciones y, por último, la programación multihilo.
Un primer programa
Se puede escribir el programa fuente usando cualquier editor de textos en un archivo
con el mismo nombre que la clase y la extensión .java
Todos los programas en Java están compuestos por clases y objetos (instancias de
clases). En nuestro caso, la clase HolaMundo posee un único método y no tiene
atributos. El método main() es el primero que se ejecuta en una aplicación. Toda
aplicación tiene que tener un método main.
public significa que cualquier objeto puede llamarlo
static indica que es un método de clase (lo veremos más adelante)
void significa que es una función que no devuelve ningún valor
El parámetro args hace referencia a los argumentos de entrada, es un vector que va de 0
a numeroDeArgumentos-1.
01/03/2002 3/24
Programación Concurrente – Introducción a Java F. Sánchez
El programa fuente HolaMundo.java se compila con javac para obtener los bytecodes
en el fichero HolaMundo.class
> javac HolaMundo.java /* ¡Ojo! Hay que poner la extensión */
LOS APPLETS
Un applet es un programa dinámico e interactivo que puede ejecutarse dentro de una
página WEB. Los applets permiten mostrar imágenes, tener animaciones, entrada y
salida de datos interactiva, juegos, efectos gráficos y sonoros, etc.
Para crear un applet, hay que escribir la aplicación correspondiente en Java, compilarla,
y referenciarla desde una página HTML. Escribiremos la aplicación anterior como un
applet. Primero escribimos el programa fuente en un archivo con el mismo nombre que
la clase y la extensión .java. Hay que incluir dos sentencias import para poder utilizar
las clase Applet y Graphics respectivamente. De momento, pensemos que la sentencia
import es como un include de C++ o un uses de Pascal. Todo applet tiene que heredar
de la clase Applet.
Hay que crear una página en HTML con una referencia a la clase del applet.
<html>
<head>
<tittle> Esta página contiene un applet de ejemplo </tittle>
</head>
<body>
Esta es la salida del applet:
<br>
<applet code="AppletHolaMundo.class" width=200 height=50>
01/03/2002 4/24
Programación Concurrente – Introducción a Java F. Sánchez
</applet>
</body>
</html>
01/03/2002 5/24
Programación Concurrente – Introducción a Java F. Sánchez
- Multithreading
- Redes
- Conexión con BD
- Distribución
Comentarios
En Java hay tres tipos de comentarios:
Los dos primeros tipos de comentarios son los que todo programador conoce y se
utilizan del mismo modo. Los comentarios de documentación, colocados
inmediatamente antes de una declaración (de variable o función), indican que ese
comentario ha de ser colocado en la documentación que se genera automáticamente
cuando se utiliza la herramienta de Java javadoc.
IDENTIFICADORES
En Java, un identificador comienza con una letra, un subrayado (_) o un símbolo de
dólar ($). Los siguientes caracteres pueden ser letras o dígitos. Se distinguen las
mayúsculas de las minúsculas y no hay longitud máxima.
PALABRAS CLAVE
Las siguientes son las palabras clave que están definidas en Java y que no se pueden
utilizar como indentificadores:
01/03/2002 6/24
Programación Concurrente – Introducción a Java F. Sánchez
PALABRAS RESERVADAS
Además, el lenguaje se reserva unas cuantas palabras más, pero que hasta ahora no
tienen un cometido específico. Son:
cast future generic inner operator outer rest var
Enteros
byte 8 bits complemento a dos
short 16 bits complemento a dos
int 32 bits complemento a dos
long 64 bits complemento a dos
Reales en coma flotante
float 32 bits IEEE 754
double 64 bits IEEE 754
Booleanos (boolean)
true
false
Caracteres
Son 16 bits sin signo. Se representan dentro de un par de comillas simples (' ').
Por ejemplo: 'a' '\t' '\u????' donde [????] es un número unicode.
Unicode es el juego de caracteres usado por Java
Java dispone de clases para cada uno de los tipos básicos. Cada clase tiene un método
para acceder al valor que encapsula.
byte b;
Byte ob = new Byte (5); // creamos un objeto Byte con el valor 5
b = ob.byteValue(); /* asignamos a b (tipo primitivo) el valor almancenado
en el objeto ob */
01/03/2002 7/24
Programación Concurrente – Introducción a Java F. Sánchez
LITERALES
Los valores constantes se crean utilizando una representación literal. Cada literal tiene
un tipo simple asociado con su valor.
Por omisión, un valor entero es int: 17 345
Un entero long lleva una L detrás: 134L
Por omisión, un valor real es double: 23.79 1.5e3
Un valor real float lleva una f detrás: 12.67f
Los valores booleanos son true y false
Los caracteres se almacenan en formato Unicode
Un carácter se representa entre comillas simples
‘a’ ‘A’ ‘3’ ‘\t’ ‘\u????’ (???? es un número)
Existen unos caracteres con significado especial:
CADENAS DE CARACTERES
Series de caracteres entre comillas dobles. Son instancias de la clase String
Ejemplos
" Esto es una cadena de caracteres"
" Esto también, con un \t tabulador"
" Y esto también, con \"comillas\" en la cadena"
ARRAYS
Se pueden declarar en Java arrays de cualquier tipo:
char s[];
int iArray[];
01/03/2002 8/24
Programación Concurrente – Introducción a Java F. Sánchez
Para crear un array en Java hay dos métodos básicos. Crear un array vacío, en cuyo caso
hay que utilizar el operador new:
int lista[] = new int[50];
Tampoco se puede rellenar un array sin declarar el tamaño con el operador new:
int lista[];
for( int i=0; i < 9; i++ )
lista[i] = i;
Es decir, todos los arrays en Java son estáticos. Para convertir un array en el equivalente
a un array dinámico en C/C++, se usa la clase Vector proporcionada por Java, que
permite operaciones de inserción, borrado, etc. en el array.
OPERADORES
Los operadores de Java son muy parecidos en estilo y funcionamiento a los de C. En la
siguiente tabla aparecen los operadores que se utilizan en Java, por orden de
precedencia:
. [] ()
++ --
! ~ instanceof
* / %
+ -
<< >> >>>
< > <= >= == !=
& ^ |
&& ||
? :
= op= (*= /= %= += -= etc.) ,
01/03/2002 9/24
Programación Concurrente – Introducción a Java F. Sánchez
El operador = siempre hace copias de objetos en el caso de las cadenas, marcando los
antiguos para borrarlos, y ya se encargará el garbage collector de devolver al sistema la
memoria ocupada por el objeto eliminado. El garbage collector simplemente es una
tarea de fondo que se encarga de eliminar aquellos objetos que no están siendo
utilizados por el programa.
SEPARADORES
Los separadores admitidos en Java son:
() - paréntesis. Para contener listas de parámetros en la definición y llamada a
métodos. También se utiliza para definir precedencia en expresiones, contener
expresiones para control de flujo y hacer las conversiones de tipo.
{} - llaves. Para contener los valores de matrices inicializadas automáticamente.
También se utiliza para definir un bloque de código, para clases, métodos y ámbitos
locales.
[] - corchetes. Para declarar tipos matriz. También se utiliza cuando se referencian
valores de matriz.
; - punto y coma. Separa sentencias.
, - coma. Separa identificadores consecutivos en una declaración de variables.
También se utiliza para encadenar sentencias dentro de una sentencia for.
. - punto. Para separar nombres de paquete de subpaquetes y clases. También se
utiliza para separar una variable o método de una variable de referencia.
CONTROL DE FLUJO
Muchas de las sentencias de control del flujo del programa se han tomado del C:
switch
switch( expr1 ) {
case expr2:
sentencias;
break;
case expr3:
01/03/2002 10/24
Programación Concurrente – Introducción a Java F. Sánchez
sentencias;
break;
default:
sentencias;
break;
}
Bucles while
while( Boolean ) {
sentencias;
}
Bucles do/while
do {
sentencias;
} while( Boolean );
break [etiqueta]
continue [etiqueta]
return expr;
etiqueta: sentencia;
En caso de que nos encontremos con bucles anidados, se permite el uso de etiquetas
para poder salirse de ellos, por ejemplo:
uno: for( )
{
dos: for( )
{
continue; // seguiría en el bucle interno
continue uno; // seguiría en el bucle principal
break uno; // se saldría del bucle principal
}
}
En el código de una función siempre hay que ser consecuentes con la declaración que se
haya hecho de ella. Por ejemplo, si se declara una función para que devuelva un entero,
es imprescindible que se coloque un return final para salir de esa función,
independientemente de que haya otros en medio del código que también provoquen la
01/03/2002 11/24
Programación Concurrente – Introducción a Java F. Sánchez
CLASES
Todo en Java son clases. No hay funciones ni variables globales. Todos los datos
básicos, como los enteros, se deben declarar en las clases antes de hacer uso de ellos. En
C la unidad fundamental son los ficheros con código fuente, en Java son las clases. De
hecho son pocas las sentencias que se pueden colocar fuera del bloque de una clase. La
palabra clave import (equivalente al #include) puede colocarse al principio de un
fichero, fuera del bloque de la clase. Sin embargo, el compilador reemplazará esa
sentencia con el contenido del fichero que se indique, que consistirá, como es de
suponer, en más clases.
Una clase debe implementarse en un archivo con el mismo nombre. La declaración e
implementación se hace en el mismo archivo.
El nombre de las clases es case sensitive. Empiezan por mayúscula (convención).
Una aplicación se compone de varias clases más una clase con un método especial
llamado main.
Por defecto toda clase hereda de Object, que es la raíz de la jerarquía de clases en Java.
Veamos un ejemplo de una clase Book que contiene 3 atributos privados de clase, un
constructor y 3 métodos públicos para acceder a los atributos. La clase es pública
también. Hay que hacer notar que String es una clase de Java mientras que int es un tipo
primitivo, no es una clase.
01/03/2002 12/24
Programación Concurrente – Introducción a Java F. Sánchez
01/03/2002 13/24
Programación Concurrente – Introducción a Java F. Sánchez
CREACIÓN DE OBJETOS
Consideremos la siguiente clase:
class Point {
int x, y;
Point (int cx, int cy) {
x = cx; y = cy; }
Point () {
x = -1; y = -1; }
public void Origen() {
x = 0; y = 0; }
}
Se puede observar que el constructor tiene el mismo nombre que la clase, sin devolver
tipo. Puede haber tantos constructores como se quiera, pero con distinta signatura.
- Creación de una instancia:
Point p = new Point(3,4);
Point p = new Point();
- Llamada a métodos:
p.Origen();
REFERENCIAS A OBJETO
Cuando tenemos algo como Point p; hay que tener en cuenta que p es una referencia a
una instancia de Point, no es una instancia, tiene un valor null. p es compatible con
instancias de subclases (clave para el polimorfismo).
Una referencia es parecido al concepto de puntero. La diferencia es que no se pueden
manipular como si fueran enteros tal y como se hace en C o C++.
Cada referencia apunta a una estructura de datos con información del tipo y dirección
real del objeto.
Puede haber múltiples referencias a un mismo objeto.
Cuando se le pasa un objeto a un método como argumento:
01/03/2002 14/24
Programación Concurrente – Introducción a Java F. Sánchez
import java.awt.Point;
class Cambia {
public static void main(String args[ ]) {
Point p1 = new Point(0,0);
cambia(p1);
System.out.println(p1);
}
static void cambia(Point p) {
p.x = 38;
p.y = 97;
}
}
import java.awt.Point;
class NoCambia {
public static void main(String args[ ]) {
Point p1 = new Point(0,0);
noCambia(p1);
System.out.println(p1);
}
static void noCambia(Point p) {
p = new Point(38, 97);
}
}
El resultado sería:
C:\CJava>java Cambia
java.awt.Point[x=38,y=97]
C:\CJava>java NoCambia
java.awt.Point[x=0,y=0]
Del ejemplo se deduce también que se puede imprimir un objeto directamente. En ese
caso se imprime el valor de sus atributos.
MODIFICADORES DE CLASES
Los tipos de clases que podemos definir son:
01/03/2002 15/24
Programación Concurrente – Introducción a Java F. Sánchez
abstract
Una clase abstract tiene al menos un método abstracto. Una clase abstracta no se
instancia, sino que se utiliza como clase base para la herencia.
final
Una clase final se declara como la clase que termina una cadena de herencia. No se
puede heredar de una clase final.
public
Las clases public son accesibles desde otras clases, bien sea directamente o por
herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para
acceder desde otros paquetes, primero tienen que ser importadas. Los conceptos de
paquete e importación se ven más adelante.
HERENCIA
Para heredar se utiliza la palabra reservada extends. Supongamos que queremos crear un
punto en 3 dimensiones.
CONTROL DE ACCESO
Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que se
quiere para las variables de instancia y los métodos definidos en la clase:
public
public void CualquieraPuedeAcceder(){}
Cualquier clase desde cualquier lugar puede acceder a las variables y métodos de
instancia públicos.
protected
protected void SoloSubClasesYMismoPaquete(){}
Sólo las subclases de la clase y las clases del mismo paquete pueden acceder a las
variables y métodos de instancia protegidos.
private
01/03/2002 16/24
Programación Concurrente – Introducción a Java F. Sánchez
CARACTERÍSTICAS DE LA HERENCIA
A cualquier referencia de X se le puede asignar un objeto derivado de X
Principales características: (si B extiende a A)
B tiene acceso a los atributos y métodos públicos y protegidos de A
B implementa todos los interfaces implementados por A
B exporta todos los atributos y métodos públicos de A.
B no puede restringir el acceso a ningún miembro de A.
B puede hacer público cualquier método protegido de A.
Cualquier método en B con la misma signatura que en A, lo redefine.
B puede añadir nuevos métodos y atributos.
ENLACE DINÁMICO
Cuando tenemos algo como: A.metodo();, siendo A superclase de B
En t. de compilación: se comprueba si metodo existe en A. Si no « error de
compilación
En t. de ejecución: A puede ser realmente una referencia a un objeto subclase
de la clase declarada para A. Se ejecuta el método de la subclase.
Veamos un ejemplo:
class Base {
public void op1(){System.out.println(“Base”);}
01/03/2002 17/24
Programación Concurrente – Introducción a Java F. Sánchez
}
class Derived extends Base {
public void op1(){System.out.println(“Deriv”);}
}
class Main {
public static void main (String args[]) {
Derived d = new Derived();
Base b = d;
b.op1(); // se imprime Deriv
d.op1(); // se imprime Deriv
}
}
INTERFACES
Los métodos abstractos son útiles cuando se quiere que cada implementación de la clase
parezca y funcione igual, pero necesita que se cree una nueva clase para utilizar los
métodos abstractos.
Los interfaces proporcionan un mecanismo para abstraer los métodos a un nivel
superior. Un interface contiene una colección de métodos que se implementan en otro
lugar. Los métodos de una clase son public, static y final.
La principal diferencia entre interface y abstract es que un interface proporciona un
mecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario a
utilizar la herencia.
Por ejemplo:
Las clases que quieran utilizar el interface VideoClip utilizarán la palabra implements y
proporcionarán el código necesario para implementar los métodos que se han definido
para el interface:
01/03/2002 18/24
Programación Concurrente – Introducción a Java F. Sánchez
También se utilizan los interfaces para compartir constantes entre varias clases:
interface SharedConstants {
int NO = 0;
int YES = 1;
int MAYBE = 2;
}
PAQUETES
La palabra clave package permite agrupar clases e interfaces. Los nombres de los
paquetes son palabras separadas por puntos y se almacenan en directorios que coinciden
con esos nombres.
Por ejemplo, los ficheros siguientes, que contienen código fuente Java y están en el
paquete denominado applet:
Applet.java, AppletContext.java, AppletStub.java, AudioClip.java
contienen en su código la línea:
package java.applet;
01/03/2002 19/24
Programación Concurrente – Introducción a Java F. Sánchez
IMPORT
Los paquetes de clases se cargan con la palabra clave import, especificando el nombre
del paquete como ruta y nombre de clase (es lo mismo que #include de C/C++). Se
pueden cargar varias clases utilizando un asterisco.
import java.Date;
import java.awt.*;
java.applet
Este paquete contiene clases diseñadas para usar con applets. Hay una clase Applet y
tres interfaces: AppletContext, AppletStub y AudioClip.
java.awt
El paquete Abstract Windowing Toolkit (awt) contiene clases para generar widgets y
componentes GUI (Interfaz Gráfico de Usuario). Incluye las clases Button, Checkbox,
Choice, Component, Graphics, Menu, Panel, TextArea y TextField.
java.io
El paquete de entrada/salida contiene las clases de acceso a ficheros: FileInputStream y
FileOutputStream.
java.lang
Este paquete incluye las clases del lenguaje Java propiamente dicho: Object, Thread,
Exception, System, Integer, Float, Math, String, etc.
java.net
Este paquete da soporte a las conexiones del protocolo TCP/IP y, además, incluye las
clases Socket, URL y URLConnection.
java.util
Este paquete es una miscelánea de clases útiles para muchas cosas en programación. Se
incluyen, entre otras, Date (fecha), Dictionary (diccionario), Random (números
aleatorios) y Stack (pila FIFO).
01/03/2002 20/24
Programación Concurrente – Introducción a Java F. Sánchez
GESTIÓN DE EXCEPCIONES
Una excepción es una condición anormal que surge en una secuencia de código durante
la ejecución de esa secuencia. En otros lenguajes de programación se utilizaban códigos
de retorno para controlar el tipo de error que ocurría en el código llamado. Era muy
común por ejemplo ver en C una variable llamada errno para controlar el tipo de error
producido.
En Java la gestión de excepciones se realiza mediante objetos. Una excepción en Java
será un objeto que describe una condición excepcional que se produce en un fragmento
de código. Las excepciones pueden aparecer de manera asíncrona en un método o
pueden ser creadas manualmente y enviadas para informar de alguna condición de error
al método que realizó la llamada.
Cinco son las palabras clave para gestionar las excepciones en Java. Básicamente, el
protocolo del manejo de las excepciones es el siguiente: se intenta (try) ejecutar un
bloque de código, y si se produce un error, el sistema lanza (throws) una excepción que
se puede capturar (catch) en base al tipo de la excepción o ser tratada finalmente
(finally) por un gestor por omisión.
try {
// bloque de código
} catch (TipoExcepcion_1 e) {
// gestor de excepciones para TipoExcepcion1
} catch (TipoExcepcion_2 e) {
// gestor de excepciones para TipoExcepcion2
throw (e); // volver a lanzar la excepción
} finally {
}
La clase Exception se usa para condiciones excepcionales que los programas de usuario
Throwable
Exception Error
RuntimeException
01/03/2002 21/24
Programación Concurrente – Introducción a Java F. Sánchez
deberían capturar. Será pues la clase de partida de las subclases que utilizaremos para
crear nuestras propias condiciones excepcionales y que se espera que otros capturen. La
otra subclase, error, define las condiciones que no deberían ser capturadas en
condiciones normales. Normalmente estas excepciones se crean como respuesta a fallos
catastróficos. Finalmente tenemos la clase RuntimeException para excepciones creadas
por el intérprete como respuesta a fallos del programa.
Try y Catch
Consideremos el siguiente programa. En él se hace una división por 0. Si ejecutamos
esto en Java nos dará un error en tiempo de ejecución y el programa abortará. Para
controlar este tipo de errores es para lo que Java proporciona la gestión de excepciones
que es similar a la de C++.
Class PruebaExcepciones {
public static void main (String args[]) {
int d=0;
int a=42/d;
}
}
Class PruebaExcepciones2 {
public static void main (String args[]) {
try {
int d=0;
int a=42/d;
} catch (ArithmeticException e) { // se captura la excepción
System.out.println ("division por cero");
}
}
}
Throw
Se utiliza para lanzar explícitamente una excepción. En este ejemplo se lanza una
excepción desde el propio try para que sea capturada por catch, donde vuelve a ser
lanzada para que sea recogida por su llamador, en este caso el método main.
class ThrowDemo {
static void demoproc () { // static para poder ser llamado desde main
try {
throw new NullPointerException (“demo”);
} catch (NullPointerException e) {
01/03/2002 22/24
Programación Concurrente – Introducción a Java F. Sánchez
Throws
Esta palabra clave se utiliza para identificar la lista de excepciones posibles que un
método puede lanzar si es que no las captura él mismo. De esta forma los llamante
pueden protegerse ante tales excepciones. Para exceciones de tipo RunTime y Errors no
hace falta. La cabecera de un método será en este caso:
type nombre-método (lista-args) throws lista-excepciones { }
Un ejemplo:
class ThrowsDemo {
static void procedure () throws IllegalAccessException {
System.out.println ("dentro de procedure");
throw new IllegalAccessException ("demo");
}
public static void main (String args[]) {
try {
procedure ();
}
catch (IllegalAccessException e) {
System.out.println ("capturada "+ e);
}
}
}
01/03/2002 23/24
Programación Concurrente – Introducción a Java F. Sánchez
Finally
Siempre que un método vaya a devolver el control al llamante, mediante una excepción
no capturada, o una sentencia return explícita dentro del bloque try, se ejecuta la
cláusula finally justo antes del final del método. Es totalmente opcional.
class ExceptionDemo {
static void compute (int a) throws MyException {
System.out.println ("llamada con compute (" +a+ ").");
if (a>10)
throw new MyException (a);
System.out.println ("salida normal.");
}
public static void main (String args[]) {
try {
compute(1);
compute(20);
}
catch (MyException e) {
System.out.println ("capturada "+e);
}
}
}
La salida sería:
llamada con compute (1).
salida normal.
llamada con compute (20).
capturada MyException[20]
01/03/2002 24/24