Resumen Fundamentos de Java
Resumen Fundamentos de Java
Resumen Fundamentos de Java
FUNDAMENTOS DE JAVA
Primer programa
C:\jdk1.1.6>javac HolaMundo.java
Como puede ver, para ejecutar el programa no es necesario indicar la extensión del archivo
ya que se asume .class.
Clase HolaMundo {
FUNDAMENTOS DE JAVA
La primera línea utiliza la palabra reservada class para declarar que se va a definir una
nueva clase. HolaMundo es un identificador válido que se utiliza para dar nombre a la clase. La
definición completa de la clase está entre la llave de apertura "{" y la correspondiente llave de
cierre "}", lo cual es similar al uso que se tiene en C++.
La segunda línea del programa utiliza varias palabras reservadas que se definen a
continuación:
public. Este es un especificador de acceso el cual indica que cualquier clase puede ver
el método main (principal). Existen otros especificadores los cuales veremos más
adelante en el curso.
static. Esta palabra indica que el método o variable se aplican a toda la clase y no a una
sola instancia (objeto). Esto permite que se llame al método sin tener que referirse a una
instancia concreta de la clase. En el caso de main, es necesario que se declare static dado
que el intérprete la llama antes de que se cree cualquier instancia. Cabe hacer mención
que la palabra static hace que las variables sean estáticas (su espacio se aparta al
momento de compilar y no al estarse ejecutando).
main. Este es el nombre del método. Java hace diferencia entre mayúsculas y
minúsculas, por lo cual es distinto el método main que el método Main. Las
implementaciones actuales de los intérpretes de Java buscan un método con este nombre
cuando se interpreta una clase para ejecutarla al inicio. Hay que hacer notar que aunque
el compilador de Java puede compilar clases sin método main, el intérprete no puede
ejecutar este tipo de clases, por lo cual se desplegaría un mensaje de error. Otra cosa
importante es que a un método se le pueden pasar parámetros, los cuales se indican
dentro de paréntesis como una lista de elementos que constan del tipo y del identificador
separados por coma (si no se requieren parámetros se ponen los paréntesis vacíos). En
este ejemplo solo existe un parámetro de tipo String denominado args, el cual es un
arreglo de instancias de la clase String (la cual almacena una cadena de caracteres), aquí
se almacenarían todas las cadenas que se pasan en la línea de comando al ejecutar el
programa (el primer índice es cero como en C).
System.out.println("Hola mundo!!!");
La tercera línea ejecuta el método println que está en out, la cual es una instancia de la clase
de OutputStream (flujo de salida) que se inicializa de manera estática en la clase System (sistema).
Este método imprime la cadena en la salida estándar y añade al final un carácter de nueva línea.
Las llaves de las siguientes líneas simplemente cierran el método main y la definición de la
clase respectivamente.
FUNDAMENTOS DE JAVA
Espacios en blanco
Java es libre de contexto, es decir, tiene una forma libre y se puede escribir de la manera en
que uno quiera. No es necesario indentar nada para que funcione correctamente. Por ejemplo, la
clase del programa anterior se pudo haber escrito en una sola línea como se muestra a continuación:
público .class HolaMundo {público estático vacío principal (Cadena args[])
{ System.out.println("Hola mundo!!!"); }}
O también se pudo haber escrito con cada palabra en una línea. Lo que importa es que por lo
menos exista un espacio en blanco, tabulador o nueva línea entre cada elemento que no esté ya
delimitado por un operador o separador.
Comentarios
Son textos que no influyen en la compilación del programa pero que son muy útiles para
explicar el funcionamiento del mismo por ejemplo.
Los comentarios tienen 3 posibles aspectos: de una sola línea, de múltiples líneas y
comentarios de documentación. Los comentarios de una sola línea comienzan con // y terminan al
final de la línea. Este estilo de comentario es útil para explicaciones breves.
Para comentarios más largos, puede crear comentarios de múltiples líneas comenzando con
un /* y terminando con un */. Cualquier cosa comprendida entre estos caracteres se considera como
comentario y el compilador lo ignora.
Una herramienta llamada javadoc (la cual genera archivos HTML) utiliza una forma
especial de comentario. Esta herramienta utiliza componentes del compilador de Java para generar
automáticamente documentación para la interfaz pública de una clase. El formato usado por
javadoc es que antes de las declaraciones de clase, métodos y variables públicas, se utilice un
comentario /** para indicar un comentario de documentación. Este comentario termina con un */
igual que en el anterior tipo de comentario. Javadoc reconoce varias variables especiales que van
precedidas por el signo @ dentro de estos comentarios.
Palabras Reservadas
Estas son identificadores especiales que Java ha reservado para controlar la definición de un
programa. Se utilizan para identificar los tipos, modificadores y mecanismos de control
incorporados. Existen 59 palabras reservadas (para la versión 1.0), las cuales en conjunto con los
operadores y separadores forman la definición del lenguaje Java. Las palabras reservadas son:
FUNDAMENTOS DE JAVA
Identificadores
Se utilizan para dar nombre a las clases, métodos y variables. Un identificador puede ser
cualquier secuencia de letras, dígitos, subrayados y el símbolo $. No debe comenzar con dígito.
Recuerde que hay diferencia entre mayúsculas y minúsculas.
Los desarrolladores de Java han seguido el convenio de nombrar todos los métodos y
variables de instancia públicos con una letra minúscula primero y marcada cada palabra que venga
a continuación con una letra mayúscula, como por ejemplo siguienteElemento y sumaTotal. Para
las variables locales y privadas, todos los identificadores están en minúsculas mezclados con
subrayados, por ejemplo importe_neto y valor_aux. Para variables final, las cuales representan
constantes, se utilizan solo mayúsculas, por ejemplo MAXIMO o MENSAJE.
Literales
Un valor constante en Java se crea utilizando una representación literal de él. Los enteros,
números en coma flotante (reales), booleanos, caracteres y cadenas se pueden poner en cualquier
lugar del código fuente de Java.
Enteros
Son el tipo más utilizad en los programas típicos. Cualquier secuencia de dígitos es un
literal entero. Los enteros pueden expresarse en 3 bases: base 10, base 8 y base 16. Los enteros
decimales son por ejemplo: 78, 563 o 8712. Los enteros octales se caracterizan por iniciar con un 0,
así pues tendríamos a 056 y 0321 como ejemplos de octales. Por último tenemos los enteros
hexadecimales los cuales inician con 0x (o OX) seguidos de una secuencia de dígitos
hexadecimales, teniendo como ejemplos a 0x5f, 0XFE0 y 0xabac0. Los literales enteros crean un
valor int, que en Java es un valor de 32 bits. Si se quiere crear un valor mayor o menor de lo que se
puede representar con 32 bits, se necesita crear un valor long (de 64 bits) agregando al final del
literal una L o una l (L minúscula), por ejemplo, 0xf6432212acL.
FUNDAMENTOS DE JAVA
Coma flotante
Son un valor decimal con una parte fraccional. Se pueden expresar en notación científica o
estándar. Por ejemplo, 3.1416 o 5.43 son literales en notación estándar (es decir, constan de una
parte entera y una fraccional separadas por un punto). La notación científica implica un número en
coma flotante en notación estándar con una notación adicional que implica una multiplicación por
diez elevado al exponente especificado. El exponente se indica mediante una E o e seguida de un
número decimal que puede ser positivo o negativo. Por ejemplo, 5.42e9 o 45.321e-2. Los números
en coma flotante son de tipo double por default (64 bits de almacenamiento) pero se puede forzar a
que se consideren float poniéndoles al final una F o f (solo requieren 32 bits pero tienen menor
capacidad y exactitud).
Booleanos
Estos solo pueden tener uno de dos valores: true (verdadero) y false (falso). Sólo se pueden
asignar estos valores a variables declaradas como boolean o ser utilizadas en expresiones con
operadores booleanos.
Carácter
Los caracteres en Java son índices en el conjunto de caracteres Unicode. Son valores de 16
bits que se pueden convertir a enteros y manipularse con los operadores de enteros, como la suma y
la resta. Un caracter literal se representa dentro de un par de comillas simples o apóstrofos (' ').
Todos los caracteres ASCII visibles se pueden introducir directamente dentro de las comillas, como
'a' o '$'. Para los caracteres que no se pueden introducir directamente, hay varias secuencias de
escape, que permiten introducir el carácter deseado, como '\'' para poder introducir el propio
apóstrofo y la '\n' para el carácter de nueva línea. También hay un mecanismo para introducir el
valor de un caracter en octal o hexadecimal. Para notación octal se utiliza la barra invertida seguida
del número de 3 dígitos. Para hexadecimal se introduce \u seguido de exactamente 4 dígitos
hexadecimales.
Cadena
Son un texto arbitrario entre comillas (" "). Las cadenas de Java deben comenzar y terminar
en la misma línea. No hay ninguna secuencia de escape de continuación de línea como en otros
lenguajes tales como C.
Tipos de Datos
expresiones atómicas, de un solo valor, como números enteros, de coma flotante, caracteres y
valores booleanos. Ahora veremos estos tipos y los compuestos, tales como las clases, los
dejaremos para después. Estos tipos simples se pueden agrupar en 4 categorías:
1. Enteros
2. Coma flotante
3. Caracteres
4. Booleanos
Enteros
Todos los tipos numéricos de Java tienen signo por lo cual no existe el modificador
unsigned como se da en C. Los tipos enteros se dan en la siguiente tabla:
Número Cantidad de bits Rango
largo 64 -263 a 263 - 1
Int 32 -231 a 231 - 1
corto 16 -32768 a 32767
byte 8 -128 a 127
Flotantes
Se utilizan para obtener resultados con fracciones decimales. Los tipos flotantes o reales son
los siguientes:
Número Cantidad de bits Rango
1.7x10-308
doble 64 a 1.7x10+308
flotar 32 3.4x10-38 a 3.4x10+38
Conversiones de tipos
En algunos tipos es posible almacenar un valor sin una conversión de tipos, a esto se le
llama conversión de tipos automática. En Java sólo es posible la conversión automática cuando el
compilador conoce que la variable destino tiene la precisión suficiente para contener el valor
origen. Esto sucede cuando se almacena una constante literal, o en algunas relaciones entre
subtipos, como almacenar un valor byte en una variable int.. A esto se le llama promoción, dado
que el tipo más pequeño se promociona o crece al tipo compatible más grande. Hay que notar que
esta promoción automática también se da en las expresiones (al tipo int), lo cual puede generar
errores en asignaciones. Se puede convertir entre estos tipos numéricos de manera explícita
anteponiendo entre paréntesis el tipo al que se quiere convertir a la expresión o variable deseada.
FUNDAMENTOS DE JAVA
Caracteres
Dado que Java utiliza Unicode para representar los caracteres de una cadena, el tipo char es
de 16 bits sin signo y se utiliza para almacenar las decenas de miles de caracteres del conjunto de
caracteres Unicode completamente internacional (latín, griego, arábigo, cirílico, hebreo, etc.).
Booleanos
Java usa el tipo boolean para representar los valores lógicos, los cuales pueden ser como ya
se menciono true o false.
Variables
Enunciados (Sentencias)
Un enunciado es lo más sencillo que se puede hacer en Java, cada uno forma una sola
operación. Todos los enunciados deben terminar con punto y coma. Los enunciados pueden ser
simples tal como la asignación y compuestos (de bloque), los cuales están formados por varios
enunciados encerrados entre llaves.
Asignación
La asignación se usa para dar un valor a una variable, lo cual se logra mediante el operador
de asignación =. La sintaxis general de una asignación es la siguiente:
variable = expresion;
Expresiones y Operadores
Un operador toma uno o mas argumentos (operandos) y realiza una determinada acción con
ellos dando un resultado.
Operadores Aritméticos
Se usan para operaciones matemáticas. Los operandos deben ser un tipo numérico. No se
pueden utilizar estos operadores con tipo boolean, pero se pueden utilizar con tipos char, dado que
este tipo es un subconjunto de int en Java.
Operador Significad Operador Significad
o o
+ Suma += Suma y asignación
- Restos -= Resta y asignación
* Multiplicación *= Multiplicación y asignación
/ División /= División y asignación
% Módulo %= Módulo y asignación
++ Incremento -- Decremento
Los tipos numéricos enteros long, int, short y byte tienen un conjunto adicional de
operadores que pueden modificar e inspeccionar los bits que componen sus valores. Estos
operadores son los siguientes:
Operador Significad Operador Significad
o o
~ NOT a nivel de bit
& Y un poco de nivel &= Y y asignación
| O un poco de nivel |= OR y asignación
^ XOR a nivel bit ^= XOR y asignación
>> Desplazamiento a la derecha >>= Desplazamiento a la derecha y
asignación
>>> Desplazamiento a la derecha >>>= Desplazamiento a la derecha
rellenando con ceros rellenando con ceros y asignación
<< Desplazamiento a la izquierda <<= Desplazamiento a la izquierda y
asignación
Operadores Relacionales
Para comparar 2 valores, Java tiene el siguiente conjunto de operadores relacionales que
describen igualdad y ordenamiento.
Operador Significad
o
== Igual a
FUNDAMENTOS DE JAVA
!= Diferente de
> Mayor que
< Menor que
>= Mayor o igual que
<= Menos que
En Java, cualquier tipo se puede comparar utilizando == y != pero los restantes solo se
pueden usar con datos numéricos.
Es típico usar el ANDy OR en cortocircuito en todos los casos en que se utiliza lógica
booleana dejando las versiones de un único carácter exclusivamente para operaciones a nivel de bit.
Precedencia de operadores
En una expresión las operaciones se dan en un determinado orden, el cual se obtiene a partir
de la precedencia que Java le da a cada uno de los operadores. La siguiente tabla muestra la
precedencia de la más alta a la más baja.
La más alta
() [] .
++ -- ~ !
* / %
+ -
>> >>> <<
> >= < <=
== !=
&
^
|
&&
||
FUNDAMENTOS DE JAVA
?:
= Ido=
La más baja
Los paréntesis al igual que en otros lenguajes se utilizan para indicar que se desea se haga
primero en una expresión.
MANEJO DE OBJETOS
Para poder utilizar objetos o instancias de una clase determinada lo primero que hay que
hacer es crearlo, es decir, obtener memoria para almacenar todos sus atributos y métodos. Para
hacer esto, se hace uso del operador new, al cual se le para el nombre de la clase de la cual se
quiere crear una instancia seguido de paréntesis. Por ejemplo, para crear una instancia de la clase
String se hace lo siguiente:
Los paréntesis pueden estar vacíos, en cuyo caso se crea el objeto más simple, o bien, puede
contener parámetros que determinan los valores iniciales de las variables de instancia u otras
cualidades de ese objeto. El número y tipo de estos argumentos están definidos por la clase misma a
través de un método especial denominado constructor (el cual inicializa el objeto y sus variables),
que veremos más adelante.
El operador new lo que hace pues es crear la instancia de la clase (objeto), asignarle
memoria y ejecutar su método constructor.
El elemento básico de la POO en Java es una clase. Una clase define la forma y
comportamiento de un objeto. Cualquier concepto que desee representar en un programa en Java
está encapsulado en una clase. Para crear una clase sólo se necesita un archivo fuente que contenga
la palabra class seguida de un identificador válido y un par de llaves para el cuerpo de la misma.
Una clase es un modelo o patrón para un objeto. Una clase define la estructura de un objeto
y su interfaz funcional, conocida como métodos. Cuando se ejecuta un programa en Java, el sistema
utiliza definiciones de clase para crear instancias de las clases, que son los objetos reales. Los
términos instancia y objeto se utilizan de manera indistinta. La forma general de una definición de
clase
FUNDAMENTOS DE JAVA
Antes que nada, hay que aclarar la diferencia entre variables locales, variables de instancia y
variables de clase. Una variable local es aquella que tiene un alcance limitado, es decir, solo
permanece activa durante la ejecución de las sentencias que se encuentran entre las llaves en la que
se declaró (dentro de un método o estructura de control), por ejemplo, en el siguiente fragmento se
puede ver una variable local num, que solo durante la ejecución de la sentencia if:
if (suma>0)
{ int num;
num=20
;
}
Una variable de instancia es aquella que existe por cada objeto (instancia de clase) creada y
que es diferente de la de los otros objetos de la misma clase, se declara fuera de cualquier método
de la clase. Por ejemplo, en la siguiente clase se encuentra la variable de instancia x, la cual existe 3
veces, una en el objeto O1, otra en el objeto O2 y otra en el objeto O3:
class Prueba {
int x;
int n estático;
};
Una variable de clase es algo similar a la de instancia con la diferencia de que solo existe
una por la clase independientemente de cuantos objetos o instancias se crearon de la misma. En el
ejemplo anterior a pesar de que se crearon 3 objetos, solo existe en memoria una variable n. Se
puede notar que para indicar que es variable de clase a la declaración se le antepone el modificar
static.
Una vez establecida la diferencia, veamos como se puede accesar una variable de instancia
de o de clase. Para ello se utiliza el operador punto (.), el cual tendrá 2 operandos, del lado
izquierdo estará el nombre de un objeto o clase y del lado derecho el nombre de la variable a
accesar, así pues, para hacer referencia a la variable x del objeto O1 se usa la siguiente notación:
O1.x
Para hacer referencia a una variable de instancia es necesario primero crear una instancia de
la clase (objeto), mientras que para hacer referencia a una variable de clase no se requiere tener
ningún objeto creado de la misma. Así, si los objetos O1, O2 y O3 no hubieran sido creados, se
podría de todos modos tener acceso a la variable de clase n mediante la siguiente notación:
Prueba.n
FUNDAMENTOS DE JAVA
Para llamar a un método de un objeto o clase, se usa una notación similar a la utilizada para
accesar a las variables. Usando el operador punto se pone el nombre del objeto o clase y el nombre
del método seguido de los parámetros a pasarle entre paréntesis (los cuales son obligatorios aun y
cuando no existan parámetros). Por ejemplo, si la clase Prueba tiene un método denominado suma
y requiere de 2 parámetros enteros, para llamarlo se haría lo siguiente:
Prueba O;
...
O.suma(10, 6);
Referencias a objetos
Al trabajar con objetos, algo importante que sucede sin nosotros darnos cuenta es el uso de
referencias (direcciones de memoria) a dichos objetos. Cuando se asignan objetos a las variables, o
los pasa como parámetros a los métodos, se trasladan las referencias a los mismos y no los objetos
mismos o una copia de ellos.
importar java.awt.Point;
class PruebaReferencias
{
public static void main (String args[])
{ Point pt1, pt2;
pt1=nuevo
punto(100.100);
pt2=pt1;
pt1.x = 200:
pt1.y = 200;
System.out.println("Punto 1: "+pt1.x+",
"+pt1.y); System.out.println("Punto 2:
"+pt2.x+", "+pt2.y);
}
}
Si corre este programa verificará que tanto pt1 como pt2 tienen los mismos datos, esto se
debe a que cuando se asigna a pt2 el valor de pt1 en realidad lo que se hace es que ambos esten
referenciando al mismo objeto (la misma dirección de memoria). Por lo tanto, si se cambia pt1
FUNDAMENTOS DE JAVA
Este manejo de las referencias hace también que las comparaciones entre objetos tengan
resultados que dependen de si se trata de exactamente el mismo objeto.
str1 = "Especialidad en
Computacion."; str2 = str1;
Al correr este programa se puede ver que en la primera igualdad nos da un valor verdadero
pues tanto str1 como str2 estan referenciando al mismo objeto mientras que en la segunda ya la
referencia es a objetos distintos por lo cual obtenemos un valor verdadero aún y cuando los valores
que contiene son los mismos.
El método getClass() está definido en la clase Object, y como tal esta disponible para todos
los objetos. El resultado de ese método es un objeto Class, el cual posee un método llamado
getName() que regresa una cadena representando el nombre de la clase.
Otra prueba que podría serle útil es el operador instanceof, el cual tiene 2 operandos: un
objeto a la izquierda y el nombre de una clase a la derecha. La expresión regresa true o false con
base en si el objeto es una instancia de la clase nombrada o se trata de cualesquiera de las subclases
de esa clase. Por ejemplo:
FUNDAMENTOS DE JAVA
Biblioteca de clases
El JDK viene con la documentación para toda la biblioteca de clases de Java e incluye
descripciones de las variables de instancia, métodos y constructores de cada clase.
java.lang: Clases que se aplican al lenguaje mismo, entre las cuales se incluye la
clase Object, la clase String y la clase System. También contiene las clases
especiales para los tipos primitivos (Integer, Character, Float, etc).
java.io: Clases de entrada y salida para escribir y leer desde flujos y para manejar
archivos.
Arreglos
Los arreglos en Java son diferentes con respecto a los otros lenguajes pues son objetos que
pueden pasarse y tratarse de la misma manera que otros objetos.
Declaración
Un arreglo es un grupo de variables del mismo tipo a la que nos referimos con el mismo
nombre. Para declarar un arreglo se usa la siguiente declaración:
tipo nombre[];
FUNDAMENTOS DE JAVA
Para los arreglos hay un valor especial llamado null, que representa un arreglo sin ningún
valor. Para dar un valor al arreglo se usa el operador new, el cual asigna el espacio del mismo. Para
utilizarlo se debe proporcionar un tipo y un número entero positivo de elementos a asignar. Por
ejemplo, para asignar diez flotantes a un arreglo tipo float se hace lo siguiente:
flotar a[];
a = nuevo flotador [12];
Otra posibilidad de asignar espacio al arreglo es al momento de declararlo dar sus valores
iniciales, por ejemplo:
String colores[] = { "Rojo" , "Verde", "Azul", "Amarillo"};
Acceso
Para acceder a un elemento del arreglo se pone el nombre del arreglo y entre corchetes la
posición deseada (la primera es la cero al igual que en C). Hay que hacer notar que Java no permite
acceder a una localidad que no existe, por ejemplo si se declaro un arreglo de tamaño 10 y se quiere
acceder a la posición 15, esto generaría un error, el cual sería de compilación o ejecución según sea
la causa.
Para evitar que en tiempo de ejecución se generen estos tipos de errores se puede obtener la
longitud del arreglo (número de elementos) accesando la variable length del arreglo (recuerde que
un arreglo es un objeto). Por ejemplo, si se tiene la siguiente declaración:
Cadena A[];
Para asignar un valor a una casilla del arreglo en particular, se usa la sentencia de
asignación después de la expresión de acceso al arreglo:
A[0]="beto";
A[29]="UAZ";
A[15]=Datos[10];
Hay que tener en cuenta que como un arreglo de objetos en Java consiste de referencias a
dichos objetos de tal forma que cuando se asigna un valor a una posición del mismo, se crea una
referencia al objeto por lo que en la última asignación lo que sucede es que se asigna la referencia,
no se copia el valor de Dato[10] a A[15]; dicho de otra manera, si cambia A[15] cambia Dato[10]
o viceversa.
FUNDAMENTOS DE JAVA
Arreglos multidimensionales
Para declarar arreglos multidimensionales se hace algo similar, por ejemplo para declarar un
arreglo bidimensional de 10 x 4 (10 renglones y 4 columnas en caso de verlo como si fuera una
tabla) se hace lo siguiente:
Condicionales si
El if permite tomar una decisión para determinar si ejecuta una parte del código o ejecuta
otra en base a una simple prueba. La sintaxis es la siguiente:
if (expresion_logica)
sentencia1;
[ else
sentencia2; ]
Condicional switch
Esta condicional permite seleccionar de entre varias alternativas en base al valor de una
expresión. La sintaxis es la siguiente:
switch (expresion) {
casi valor1 : sentencias;
casi valor2: sentencias;
....
[ default: sentencias; ]
}
Lo que hace el switch es evaluar la expresión y el resultado compararlo con cada uno de los
valores puestos con la palabra reservada case, si resulta igual a alguno de ellos comienza a ejecutar
las sentencias que están a continuación del valor. La claúsula default es opcional y si se pone las
sentencias que tiene se ejecutan solo si la expresión tiene un valor distinto a los valores puestos en
el switch. Hay que hacer mención que al igual que en el C, si no se pone la palabra reservada break
al final de las sentencias que se quieren ejecutar por cada valor, la ejecución continuará hasta
encontrar un break o finalizar el case. break lo que hace es terminar la ejecución del case y
continuar con las sentencias que estén después del mismo.
FUNDAMENTOS DE JAVA
También hay que aclarar que la expresión y valores sólo pueden ser enteros (a
excepción del tipo long) o carácter.
Ciclo para
Permite la repetición de una sentencia o de un conjunto (bloque) de las mismas mientras una
condición se cumple. Su sintaxis es la siguiente:
Condición. Es la prueba (expresión lógica) que ocurre al final de cada vuelta del
ciclo. Si la condición dada se cumple (la expresión es verdadera) el ciclo sigue,
de otra manera termina la ejecución del ciclo.
La sentencia se ejecuta cada vez que se entra al ciclo. Esta puede estar vacía si solo
se requiere ejecutar la parte entre paréntesis.
Ciclo while
Se utiliza para repetir una sentencia o conjunto de las mismas mientras una determinada
condición se cumpla. La sintaxis es la siguiente:
while (condición)
sentencia;
Este ciclo es similar al anterior, solo que primero se ejecutan las sentencias y posteriormente
la condición de tal forma que las sentencias se ejecutan por lo menos una vez. La sintaxis es la
siguiente:
FUNDAMENTOS DE JAVA
de {
sentencias;
} while (condicion);
Para salir de los ciclos se pueden usar las sentencias break y continue.
La sentencia break hace que el ciclo termine su ejecución (si es que esta dentro de uno). Por
otro lado, la sentencia continue hace que el ciclo continue, pero en la siguiente vuelta, es decir, si la
sentencia continue esta a la mitad de las sentencias del ciclo, las que restan para terminar esa vuelta
del ciclo se omiten y se vuelve a la primera que contenga el mismo (otra vuelta). En el caso del for
se ejecuta primero la parte de incremento.
Definición de clases
Si la clase es una subclase de otra, se utiliza la palabra extends para indicar cual es su
superclase:
class nombre extend nombresuperclase {
....
}
clase nueva {
int n;
char c; // Estas son variables de instancia
FUNDAMENTOS DE JAVA
....
}
Estas variables se denominan de instancia porque como ya lo mencionamos existe una por
cada instancia de la clase (objeto) que se cree, y son accesibles por cualquier método de la clase.
Constantes
Las variables de instancia o de clase pueden ser constantes, es decir, que una vez asignado
su valor, no pueda ser modificado durante la ejecución del programa. Para indicar que una variable
va a ser constante se le antepone a su declaración la palabra reservada final. Ejemplos:
clase nueva {
int n;
char c; // Estas son variables de instancia
static int x; // Esta es una variable de clase
....
}
Creación de métodos
En Java se maneja un término denominado identificación del método, el cual consiste del
nombre del método, el tipo de objeto o simple regresado y la lista de parámetros.
FUNDAMENTOS DE JAVA
En otros lenguajes, el nombre del método es suficiente para distinguirlo de otros métodos
del programa. En Java, puede tener diferentes métodos con el mismo nombre, pero con un tipo de
retorno o lista de parámetros distinta. A esto se le llama sobrecarga de métodos (polimorfismo).
El modificador indica si el método puede accesarse solo desde la clase o desde otras clases
(por default es public, accesible por todos); estos los veremos más adelante. El tipo indica que es lo
que va a regresar el método al terminar su ejecución (int, short, etc.). Si regresa un arreglo, este se
indica poniendo el nombre del tipo del arreglo seguido de corchetes vacíos:
int[] ordenado (int n) {
...
}
La lista de parámetros va entre paréntesis después del nombre del método, estos van
separados por coma y se indica tanto el tipo como el nombre de cada uno separados por espacio.
El cuerpo del método lo conforman todas las sentencias necesarias para que el método
realice su trabajo y estas van entre las llaves que aparecen después de la lista de parámetros.
Esta palabra se utiliza cuando en la definición de un método se quiera referir al objeto actual
para poder utilizar sus variables de instancia o bien, para poder pasar el objeto actual como
parámetro a otro método. A continuación se muestran ejemplos de esto:
En muchos casos se puede sin embargo omitir el uso de la palabra this. Para referirse a las
variables de instancia o métodos de la clase actual se puede usar sólo el nombre pues this esta
ímplicito en estas referencias:
Hay que hacer notar que si por ejemplo existe una variable local x desde donde se hace el
primer acceso de ejemplo, es necesario el uso de la palabra this para poder acceder a la variable de
instancia, de otra manera, se accesa la variable local.
FUNDAMENTOS DE JAVA
También hay que aclarar que la palabra this se usa para las variables de instancia mas no
para las variables de clase.
Métodos de clase
Así como existen variables de instancia y de clase, existen métodos de instancia y de clase y
la diferencia entre estos 2 tipos es análoga. Los métodos de clase están disponible para cualquier
instancia de la clase así como en otras clases. En consecuencia, algunos métodos se usan en
cualquier lugar, sin importar si una instancia de la clase existe o no.
Por ejemplo, las biblotecas de clase de Java incluyen una clase llamada Math, la cual define
un conjunto completo de operaciones matemáticas que puede usarse en cualquier programa:
root float =Math.sqrt(26.7);
Para definir métodos de clase se emplea la palabra reservada static antes de definir el tipo
de resultado que va a regresar el método:
static char upcase (char c) { ... }
Si los métodos van a ofrecer una utilidad general que no afecten de manera directa a una
instancia de la clase, lo mejor es definirlos como métodos de clase. De otra manera, los métodos
son de instancia, que de hecho son la mayoría.
Creación de aplicaciones
Una aplicación Java consiste de una o mas clases. HotJava (un navegador de Web) es un
ejemplo de una aplicación Java. Lo único que se necesita para ejecutar una aplicación Java es una
clase que funcione como punto "de arranque" para el resto del programa Java. Si el programa es
pequeño, solo se necesita esa clase.
Lo único que resta decir es que args es un arreglo de cadenas de caracters las cuales
contiene los parámetros de la línea de comando; es decir, si al ejecutar el programa se le pusieron
parámetros estos quedan en cada una de las posiciones de args. Por ejemplo, si hace lo siguiente:
C:\jdk1.1.6>java Programa Juan sin miedo
En la clase Programa el método main puede accesar a los parámetros (Juan sin miedo) a
través del arreglo args quedando de la siguiente manera:
args[0]="Juan"
args[1]="sin"
args[2]="miedo"
FUNDAMENTOS DE JAVA
Polimorfismo
El lenguaje Java permite que se tengan varios métodos con el mismo nombre pero con
distintos parámetros, a esto se le denomina polimorfismo (o sobrecarga de métodos). Este
polimorfismo permite a las instancias de clase tener una interfaz más sencilla para otros objetos (no
hay necesidad de métodos por completo diferentes que realizan en esencia lo mismo) y comportarse
en forma distinta en base a la entrada dada al método.
Cuando se llama a un método Java hace coincidir el nombre, número y tipo de parámetros
para seleccionar la definición del método a ejecutar.
Para crear un método sobrecargado (polimorfico) todo lo que se necesita es crear varias
definiciones distintas de método en su clase, todas con el mismo nombre, pero con diferente lista de
parámetros (ya sea en número o en tipo). Hay que hacer notar que el tipo que devuelve el método
no se toma en cuenta para diferenciar los métodos sobrecargados.
Métodos constructores
Un método constructor es una clase especial que determina como se inicializa un objeto
cuando se crea.
Si la clase no cuenta con algún método constructor especial definido, aún así se obtiene un
objeto pero se requerirá de inicializar las variables explícitamente o llamando a algún método que
el objeto necesita para ello.
Al definir los métodos constructores en una clase, se pueden configurar valores iniciales de
las variables de instancia, llamar métodos basados en esas variables o llamar métodos de otros
objetos, o bien calcular propiedades iniciales de su objeto. También es factible que se tengan
métodos constructores sobrecargados.
Los constructores son muy parecidos a los métodos ordinarios, con 2 diferencias básicas:
1. Siempre tienen el mismo nombre de la clase
2. No tienen un tipo de retorno
Algunos constructores podrían ser un conjunto más amplio de otro constructor definido en
su clase; es decir, puede tener el mismo comportamiento y un poco más. En lugar de duplicar su
FUNDAMENTOS DE JAVA
Métodos sobrepuestos
Para sobreponer un método, todo lo que tiene que hacer es crear uno en su subclase que
tenga la misma identificación (nombre, número y tipo de parámetros) de otro definido en una de
sus superclases. Puesto que Java ejecuta la primera definición del método que encuentra que
coincida con la identificación, esto en forma eficiente "oculta" la definición del original.
En ocasiones, se requerirá de llamar al método original, para ello, dentro de la definición del
método, se utiliza la palabra reservada super para pasar la llamada al método hacia una jerarquía
superior. Por ejemplo, si en una subclase se sobrepuso el método Imprime y se quiere llamar al
original desde el método sobrepuesto, la llamada sería:
fenomenal.
Imprime()
Métodos de finalización
Los métodos de finalización son lo contrario de los métodos constructores; mientras que un
método constructor se utiliza para inicializar a un objeto, estos métodos de finalización se llaman
justo antes de que sea recolectado como basura y se reclame su memoria.
Dentro del cuerpo se incluye cualquier limpieza que desee realizar para ese objeto. Estos
métodos se utilizan casi siempre para optimizar la eliminación de un objeto, por ejemplo, al
eliminar las referencias a otros objetos, al liberar recursos externos que han adquirido o para otros
comportamientos que puedan facilitar la eliminación del objeto.
FUNDAMENTOS DE JAVA
Manejo de Cadenas
Una cadena es una secuencia de caracteres. Las cadenas son una parte fundamental de la
mayoría de los programas; incluso los programas gráficos necesitan manipular habitualmente
cadenas de texto para los nombres de archivo y otros objetos con nombre. Debido a este gran uso
de las cadenas, Java tiene varias características incorporadas que facilitan la manipulación de
cadenas. Java tiene una clase incorporada en el paquete java.lang que encapsula la estructura de
datos de una cadena. Esta clase se denomina String.
Constructores
Como con todas las otras clases, se pueden crear instancias de String con el operador new.
Para crear un String vacío, se puede llamar al constructor por defecto sin parámetros:
String cad = new String();
Para crear un String inicializado con caracteres, hay que pasarle una matriz de char al
constructor, como se muestra a continuación:
char c[]={'a','c','a','b','a'};
String cad = new String(c);
Creación de cadenas
Dado que los Strings son valores constantes, Java permite que entre cadenas se especifique
la cadena entre comillas, tal como se había mencionado antes y se puede inicializar como sigue:
String cad = "Me pregunto";
Uno de los métodos mas usados de la clase String es length(), el cual devuelve la longitud
en caracteres de la cadena (No confundir con la variable de instancia length de los arreglos).
Hay que notar que como Java crea un objeto String cada vez que se tiene una constante
literal de cadena entonces se puede llamar al método length directamente como en el siguiente
ejemplo:
"UAZ".length();
FUNDAMENTOS DE JAVA
Concatenación de cadenas
NOTA: En realidad cuando se usa el operador + con los Strings se está llamando al método
append, el cual se encarga de agregar al String lo indicado después del +.
Conversión de cadenas
Debido a que el método append tiene una versión para cada tipo simple que existe entonces
se puede hacer por ejemplo lo siguiente:
"Cadenita " + 78 + 3.782
Lo que da como resultado "Cadenita 783.782".
Para lograr esto el método append llama a un método de clase de String denominado
valueOf para construir la representación típica de una cadena. Para tipos simples, valueOf crea
simplemente una representación de cada int o float. Para objetos, valueOf llama al método toString
con ese objeto. Cada clase implementa toString, con una implementación por defecto que se
encuentra en la clase Object. Es bueno sobreponer el método toString y presentar una versión
propia de cadena para las clases.
Extracción de caracteres
Para extraer un carácter de una cadena, se puede referir al caracter indexado mediante el
método charAt pasandole como parámetro el índice deseado. No se debe llamar a este método con
un índice menor de cero o mayor de la longitud de la cadena. Si se necesita extraer más de un
carácter a la vez, puede utilizar el método getChars, al cual hay que pasarle el índice desde el cual
se quieren tomar los caracteres y el del último caracter deseado (+1).
También existe una función útil llamada toCharArray que devuelve una matriz de char que
contiene la cadena completa o bien, se puede usar el método getBytes el cual coloca los caracteres
en una matriz de bytes, descartando el byte más significativo.
Comparación de cadenas
Para ver si 2 cadenas son iguales se utiliza el método equals de String. Este devuelve true si
el parámetro está compuesto por los mismos caracteres que el objeto que llama al método.
String s1="Hola", s2="Hola";
s1.equals(s2); // Esto devuelve true
FUNDAMENTOS DE JAVA
Una forma alternativa es el método equalsIgnoreCase, el cual ignora si los caracteres son
mayúsculas o minúsculas, es decir, las considera iguales.
El método regionMatches se utiliza para comparar una región específica que es parte de una
cadena con otra región de otra cadena. Hay una opción para que las mayúsculas y minúsculas se
consideren iguales. A continuación se muestran los prototipos de ambas:
boolean regionMatches(int desp, String otra, int odesp, int longitud);
boolean regionMatches(boolean ignorar, int desp, String otra, int odesp, int longitud);
El parámetro ignorar se pone en true si se desea ignorar si las letras son mayúsculas o
minúsculas, el parametro offset indica desde que posición en la cadena que llama al método se va a
tomar, el parámetro otra es la cadena con la que se va a comparar, el parámetro odesp indica desde
que caracter se va a tomar en la otra cadena y por último, el parámetro longitud indica de cuantos
caracteres es la región a comparar.
Otro método es startsWith, el cual comprueba si la cadena que manda llamar al método
comienza con la cadena que se pasa como parámetro.
Hay que notar que equals y el operador == hacen cosas muy distintas pues mientras el
primero compara el contenido caracter a caracter, el segundo determina si ambas hacer referencia al
mismo objeto.
Para hacer comparaciones que no sean de igualdad se usa el método compareTo el cual
compara la cadena que llama al método con la cadena pasada como parámetro y devuelve 0 si son
iguales, un número entero negativo si es menor la primera y un número entero positivo si la primera
es mayor.
Búsqueda
La clase String proporciona los métodos indexOf y lastIndexOf, los cuales reciben como
parámetro un caracter o una cadena y devuelven el índice de la primera y última aparición,
respectivamente, de lo que se paso como parámetro dentro de la cadena que llama al método. Si no
tienen éxito, devuelven -1.
O bien, si se le pueden dar 2 parámetros a ambos métodos, en cuyo caso el significado del
primer método es el índice de la primera aparición del caracter o cadena desde el índice dado como
segundo parámetro; y en el caso del segundo método de la última aparición antes del índice dado.
CONCAT
FUNDAMENTOS DE JAVA
Este método concatena a la cadena que lo manda llamar la cadena pasada como parámetro.
reemplazar
Recibe 2 parámetros de tipo caracter y sustituye en la cadena que lo manda llamar las
apariciones del primero por el segundo.
toMinúsculas
Convierte a minúscula la cadena que lo manda llamar.
aMayúsculas
Convierte a minúscula la cadena que lo manda llamar.
recortar
Devuelve una copia de la cadena que lo manda llamar sin espacios en blanco iniciales o
finales.
Clase StringBuffer
Esta es una clase gemela de la clase String que proporciona una gran parte de la
funcionalidad de la utilización habitual de las cadenas. String representa secuencias de caracteres
de longitud fija e inmutables. StringBuffer representa secuencias de caracteres que se pueden
ampliar y modificar. Con StringBuffer se pueden insertar caracteres y subcadenas. StringBuffer
crecerá automáticamente para hacer sitio a dichas adiciones.
Constructores
ensureCapacity
Se utiliza para establecer el tamaño del buffer después de haber construido el objeto
StringBuffer.
setLength
Se usa para establecer la longitud exacta del valor String de un buffer, este rellena con ceros
si se establece la longitud a un valor mayor que la longitud actual y trunca el String si se da un
valor menor que el actual.
FUNDAMENTOS DE JAVA
charAt y setCharAt
getChars
Se usa para copiar una subcadena de un StringBuffer en un arreglo. Se debe tener cuidado
en asegurar que el arreglo tenga lo longitud suficiente para almacenar la subcadena a extraer.
void getChars(int PosInicial, int PosFinal, char Destino[], int posIniDest)
añadir
Este método se llama comúnmente a través del operador +. Tiene versiones sobrecargadas
para todos los tipos. Se llama a String.valueOf para cada parámetro y el resultado se añade al
StringBuffer. Cada versión de append devuelve el propio buffer, lo cual permite que se encadenen
llamadas a append como se muestra a continuación:
StringBuffer cad = new StringBuffer(20);
Cadena s;
s = cad.append("Fac."). append("UAZ
99"
insertar
Es igual al método append en que tiene versiones para todos los tipos posibles y se
diferencia en que coloca los caracteres devueltos por String.valueOf en el buffer a partir de un
índice especificado por el primer parámetro.
void insert(int Posicion, String cadena)
Utilidades
La biblioteca de clases de Java contiene un conjunto de clases utilizadas en todos los otros
paquetes principales de Java. Estas clases están almacenadas en los paquetes java.lang y java.util.
Se utilizan para almacenar conjuntos de objetos, realizar la interfaz con funciones del sistema de
bajo nivel, funciones matemáticas, generación de números aleatorios y manipulación de hora/fecha.
Número de clase
FUNDAMENTOS DE JAVA
Esta clase representa una interfaz a todos los tipos escalares estándar. Number tiene
métodos de acceso que devuelven el valor posiblemente redondeado del objeto de cada uno de los
tipos simples:
Flotador doble y
Aparte de los métodos ya mencionados proporcionan varias funciones muy útiles para la
manipulación de valores double y float. Ambas clases tienen 2 constructores para inicializarlas con
valores double y float, o también se pueden inicializar con una representación String del valor.
Algunos de los métodos son:
Estas sirven para almacenar datos tipo byte, short, int y long y tienen métodos para convertir
a cadena así como obtener enteros a partir de cadenas. Algunos de estos métodos son:
parseInt(String, base) hace lo mismo que el anterior pero aquí se indica la base del
número en el String
FUNDAMENTOS DE JAVA
Carácter
Esta es una clase que contiene un char. Tiene varios métodos de clase útiles como son:
Vector
Fecha
Esta clase se utiliza para representar una fecha y una hora (aunque a partir de la versión 1.1
ha sido sustituida por la clase Calendar. Se puede manipular el día, mes, año, día de la semana,
horas, minutos y segundos. Hay un constructor para objetos Date, Date(), el cual inicializa el objeto
con la fecha y hora actual.
Calendario
Esta es una clase abstracta que sirve para convertir entre un objeto Date y un conjunto de
campos enteros tales como YEAR, MONTH, DAY, HOUR, etc. JDK proporciona una subclase de
Calendar denominada GregorianCalendar. El método getInstance() regresa un objeto
GregorianCalendar cuyos campos han sido inicializados con la fecha y hora actuales.
Por último, el método toString convierte a una representación de cadena del objeto Calendar
con el siguiente aspecto: "Mon, 8 Mar 1999 10:56:23", toLocaleString() convierte a una cadena
más corta como: "03/03/99 10:56:23".
Matemática
Esta clase contiene todas las funciones en coma flotante que se utilizan en geometría y
trigonometría. Existen 2 constantes double que se utilizan en este tipo de cálculos, E
(aproximadamente 2.718) y PI (aproximadamente 3.14159)
Esta clase sirve para generar números seudoaleatorios. Cuando se inicializa un objeto
Random con una semilla se puede obtener a continuación lo que parece una secuencia aleatoria.
Generalmente, Java utiliza la hora actual como semilla para el objeto Random para disminuir la
probabilidad de obtener secuencias de números repetidas. Hay 5 tipos de números aleatorios que
ese pueden extraer de un objeto Random. Con el método nextInt se obtiene un int a lo largo de su
rango, con el método nextLong se obtiene un long a lo largo de su rango, con nextFloat se obtiene
un float, con nextDouble se obtiene un double (estas últimas 2 dan un número entre 0.0 y 1.0). Por
último, nextGaussian devuelve un double de distribución gaussiana centrada en 0.0 con una
desviación típica de 1.0. A esta distribución se le llama curva tipo campana.
FUNDAMENTOS DE JAVA
Paquetes
Los paquetes son tanto un mecanismo para dar nombres como un mecanismo de restricción
de visibilidad. Se pueden poner clases dentro de los paquetes sin permitir que el exterior sepa que
están allí. Cada archivo .java tiene las mismas cuatro partes internas, de las cuales solo hemos
hecho uso de una hasta el momento. A continuación se muestra el formato general de un archivo
fuente de Java.
Una sentencia de paquete (opcional)
Las sentencias de importación deseadas
(opcional) Una declaración de clase pública
Las clases privadas del paquete (opcional)
Para indicar que se tiene un paquete se usa la palabra reservada (package), la cual dice en
que paquete se deberían definir ls clases incluidas. Los paquetes definen un conjunto de espacios de
nombres particionados en los que se almacenan las clases. Si se omit la sentencia package, las
clases terminan en el paquete por defecto, que no tiene nombre. El compilador de Java utiliza
directorios del sistema de archivos para almacenar paquetes. Si se declara que una clase está dentro
de un paquete llamado MiPack, entonces el archivo fuente de esa clase se debe almacenar en un
directorio llamado MiPack. El formato de la sentencia package es el siguiente:
paquete paq1[. paq2[.paq3]];
Observe que se puede crear una jerarquía de paquetes dentro de paquetes separando los
niveles con puntos. Un paquete declarado como
paquete java.awt.imagen;
Sentencia import
Lo que se pone después de una sentencia package y antes de las definiciones de clase en un
archivo fuente en Java puede ser una lista de sentencias import. Esta sentencia permite incluir en el
programa las clases que se necesiten para su funcionamiento. La forma general del import es la
siguiente:
Si existe una clase con el mismo nombre dentro de 2 o mas paquetes distintos importados,
cuando se quiera hacer uso de una de ellas se debe indicar de manera completamente cualificada, es
decir, se tiene que indicar dentro de que paquetes se encuentra la clase específica deseada.
Protección de Acceso
Las palabras reservadas utilizadas para la protección son: public, private y protected cuyas
combinaciones así como el acceso que dan sobre a categorías arriba mencionadas se muestran en la
siguiente tabla:
Sin privado protegido Privado público
modificador protegid
o
Misma clase Sí Si S S Sí
Misma subclase de Sí No í í ,
paquete S S sí
Misma no subclase Sí No í í
de paquete Sí
Subclase de diferente N No Sí No
paquete Sí
No subclase en o No Si Si
diferente paquete ,
N N N
sí
o o o
FUNDAMENTOS DE JAVA
MANEJO DE EXCEPCIONES
Una excepción es una condición anormal que surge en una secuencia de código durante la
ejecución. Tradicionalmente, los lenguajes de programación forzaban al programador a utilizar
códigos de retorno recibidos desde las llamadas a función para señalar errores al código llamante.
El manejo de excepciones de Java lleva el manejo del error en tiempo de ejecución al mundo
orientado a objetos. Una excepción en Java es un objeto que describe una condición excepcional
que se ha producido en un fragmento del código. Cuando surge una condición excepcional, se crea
un objeto Exception que se envía al método que ha provocado la excepción. Ese método puede
capturar la excepción en base a su tipo concreto. Los métodos también se pueden proteger frente a
una salida prematura mediante una exepción y hacer que se ejecute un bloque de código justo antes
de que una excepción provoque que se termine el método. 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 llamante.
Fundamentos
El manejo de excepciones de Java se hace mediate cinco palabras reservadas: try, catch,
throw, throws y finally. Básicamente, 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 manejador por default.
probar {
// bloque de código
} catch (TipoExcepcion1 e) {
// manejador de excepción para TipoExcepcion1
} catch (TipoExcepcion2 e) {
// manejador de excepción para TipoExcepcion2
throw(e) ; //volver a lanzar la excepción
} finally { // Código a realizarse al finalizar la ejecución del método
}
Tipos de Excepción
Hay una única clase en la parte superior de la jerarquía de clases de excepción llamada
Throwable (lanzable). Esta clase se utiliza para representar todas las condiciones excepcionales.
Cada tipo de excepción de la forma general anterior es una subclase de Throwable. Se definen 2
subclases inmediatas que dividen a las clases de Throwable en 2 ramas distintas. Una clase,
Exception, se utiliza para las condiciones excepcionales que los programas de usuario deberían
capturar. Es la clase de partida de las subclases que utilizaremos para crear nuestras propias
condiciones excepcionales y que esperamos que otros capturen. La otra rama es la clase Error, que
define las condiciones que no se deberían de capturar normalmente. Tenga cuidado al capturar las
FUNDAMENTOS DE JAVA
Excepciones no Capturadas
Los objetos de excepción los crea automáticamente el intérprete de Java como respuesta a
alguna condición excepcional. Por ejemplo, el siguiente programa incluye una expresión que tiene
una división entre cero durante la ejecución:
class Ejemplo {
public static void main (String a[])
{ int d=0;
int a=42/d;
}
}
El registro incluye el nombre de la clase, el nombre del método, el nombre del archivo
fuente y el número de línea que generó la excepción. Se puede ver también que el tipo de excepción
es una subclase especial de Exception denominada ArithmeticException que describe más
específicamente el tipo de error que se ha producido. A continuación se muestra una variante del
código del ejemplo anterior:
class Ejemplo {
static void subrutina()
{ int d=0;
int a=42/d;
}
public static void main (String a[])
{ subrutina();
FUNDAMENTOS DE JAVA
}
}
Como puede ver, el final de la pila es la línea 7 de main, que llama al método subrutina, que
provocó la excepción en la línea 4.
Prueba y captura
Es muy conveniente que el intérprete de Java muestre el registro de la pila detallado cuando
no se captura una excepción, pero a menudo será mejor que maneje la excepción usted mismo y
que continúe la ejecución. Como ya se mencionó se usa la palabra try para especificar el bloque de
código que se debería proteger frente a todas las excepciones, y adelante del bloque try se incluye
la cláusula catch para especificar el tipo de excepción que se desea capturar. Por ejemplo, para el
primer ejemplo el código sería como sigue:
class Ejemplo {
public static void main (String a[])
{ int d=0;
probar {
int a=42/d;
} catch (AritmethicException e)
{ System.out.println("Division entre
cero");
}
}
}
En realidad, como la cláusula try y la cláusula catch tienen una sola sentencia no requieren
de llaves.
el manejador en tiempo de ejecución de Java más externo toma el control e imprime el registro de
la pila.
En algunos casos, la misma secuencia de código puede activar más de una condición
excepcional. Se pueden tener para ello varias cláusulas catch, las cuales son inspeccionadas en el
orden en el que están y el primero que coincida con el tipo de excepción se ejecuta. Las clases de
excepción más específicas se deben poner primero. Por ejemplo el siguiente programa captura 2
tipos de excepción diferentes:
class Multicatch {
public static void main (String a[])
{ try {
int n=a.length;
System.out.println("n="+n);
int b=42/n;
int c[]={1};
c[42]=99;
} catch (ArithmeticException e)
{ System.out.println("división entre cero:" +
e);
} catch (ArrayIndexOutOfBoundsException e)
{ System.out.println("Indice de arreglo no existente:" +
e);
} catch (Throwable t)
System.out.println("Se ha obtenido t:" + t);
}
}
}
La sentencia try se anida de una manera muy similar a los ámbitos de las variables. Se
puede colocar una sentencia try envolviendo a una llamada a método y dentro de ese método, otra
sentencia try podría proteger a algún otro fragmento de código. Cada vez que se introduce una
sentencia try, se almacena en la pila el contexto de excepción hasta que terminan todas las
sentencias try anidadas. Si una sentencia try no tiene un manejador catch para una excepción en
concreto, se examina la pila buscandi los siguientes manejadores catch de sentencias try. Esto
continúa hasta que se agotan las sentencias try apiladas y en dicho momento se imprimirá el
registro de la pila y se detendrá la ejecución.
FUNDAMENTOS DE JAVA
class Anidada {
static void proceso() {
probar
{
int c[]={1};
c[42]=99;
} catch (ArrayIndexOutOfBoundsException e)
{ System.out.println("Index in existing:" + e);
}
}
tirar
La sentencia throw se utiliza para lanzar explícitamente una excepción. En primer lugar,
debe obtener un descriptor de una instancia de Throwable, mediante un parámetro en una cláusula
catch, o crear una utilizando el operador new. Esta es la forma general de una sentencia throw:
lanzar InstanciaThrowable;
class ThrowDemo {
static void demoproc()
{ probar
{ throw new NullPointerException("demo");
} catch NullPointerException e)
{ System.out.println("Excepcion capturada en
demoproc"); throw e;
}
}
FUNDAMENTOS DE JAVA
Este ejemplo tiene 2 oportunidades de tratar con el mismo error. Primero main establece un
contexto de excepción y luego llama a demoproc, el cual también establece un contexto de
excepción y lanza inmediatamente una nueva instancia de NullPointerException. Esta se captura en
la línea siguiente, imprime que ha sido captura y la vuelve a lanzar, capturandola ahora el catch en
main.
Lanza
A continuación se muestra un ejemplo de un programa que intenta lanzar una excepción sin
tener código para capturarla y tampoco utiliza throws para declarar que se lanzará esta excepción,
por lo tanto no se compilará:
class ThrowsDemo1 {
static void proceso()
{ System.out.println("Capturada dentro de proceso");
throw new IllegalAccessException("demo");
}
Para que se pueda compilar este programa hay que indicar que el método lanza una
excepción IllegalAccessException, con lo que se asciende el problema un nivel más arriba en la
FUNDAMENTOS DE JAVA
pila de llamadas. Ahora main llama a proceso, que se ha declarado que lanza una
IllegalAccessException pero main no tiene una sentencia try/catch que capture esta excepción, por
lo que no compilará, por lo tanto, para que el programa compile este debería ser como sigue:
class ThrowsDemo {
static void proceso() throws IllegalAcessException
{ System.out.println("Dentro de proceso");
throw new IllegalAccessException("demo");
}
finalmente
class FinallyDemo {
vacío estático procA()
{ probar
{ System.out.println("Dentro de procA");
throw new RunTimeException("demo");
} finalmente {
FUNDAMENTOS DE JAVA
System.out.println("finalmente de procA");
}
}
En este ejemplo se puede ver que al terminar tanto el procA (por una excepcion)
como el procB (de manera normal) se ejecuta el bloque finally antes de que devuelvan el control.
Así pues, la salida de este programa sería:
C:\>java FinallyDemo
Dentro de procA
finally de procA
Dentro de procB
finally de procB
Subclases de excepción
Solamente se pueden capturar o lanzar subclases de la clase Throwable. Los tipos simples
como int o char y las clases que no son Throwable, como String no se pueden utilizar como
excepciones. La utilización mas habitual de las excepciones es crear un tipo de excepción
personalizado mediante la creación de una subclase de Exception. Estas subclases no tendrán
mucho que implementar, pero su simple existencia en los tipos permite la generación de código que
tiene modos de fallo comprensibles y que proporciona una interfaz limpia y orientada a objetos para
los clientes de las clases. Por lo tanto, la definición de métodos públicos incluye los tipos de
excepciones que se pueden lanzar. Este es un programa ejemplo que declara una nueva subclase de
Exception, y después utiliza esa subclase para señalar una condición de error en un método:
class DemoExcepcion {
static void calculo (int a) throws MiExcepcion
{ System.out.println("Llamada a
calculo("+a+")."); if (a > 10)
lanzar nuevo MiExcepcion(a);
System.out.println("Salida normal.");
}
Entrada/Salida
La mayoría de los programas no pueden alcanzar sus metas sin acceder a datos externos.
Estos datos se recuperan a partir de un origen de entrada. Los resultados de un programa se envían
a un destino de salida. La noción genérica de una fuente de entrada puede representar muchos tipos
de entrada distintos como son los archivos de disco y el teclado. Del mismo modo, un destino de
salida puede ser un archivo de disco o el monitor. Estas abstracciones son una manera limpia de
tratar la entrada/salida (E/S) sin necesitar que todo el código comprenda la diferencia entre un
teclado y un archivo.
Java llama flujo a esta abstracción y la implementa con varias clases del paquete java.io. El
flujo de E/S representa todos los orígenes y destinos de los datos a través de una interfaz uniforme.
La entrada esta encapsulada en la clase InputStream y la salida en la clase OutputStream. Estas 2
clases abstractas son las que todos los objetos deberían referenciar cuando tratan la E/S en general.
Java tiene varias subclases concretas de cada una de ellas para tratar las diferencias entre archivos
de disco, conexiones de red o teclado y monitor.
Puesto que la E/S de archivo es una operación habitual, el paquete java.io incluye una clase
File para trabajar directamente con el sistema de archivos. Esta clase permite que se trabaje con los
atributos de fecha y hora de los archivos y que se pueda iterar a través de las jerarquías de
directorios.
Archivo
Un File es es el único objeto del paquete de E/S que referencia a un archivo de disco real.
La clase File no especifica como se recupera o almacena la información en los archivos, solo
describe las propiedades de un objeto archivo.. Un directorio en Java se trata igual que un archivo
con una propiedad adicional -una lista de nombres de archivo que se puede examinar utilizando el
método list.
Los objetos archivo se pueden crear utilizando uno de los 3 constructores disponibles:
El tercero usa 2 parámetros, el primero es un objeto tipo File que apunta a un trayecto
(ruta padre) y el segundo es el nombre de un archivo.
boolean canWrite()
Devuelve verdadero si el archivo se puede escribir
int CompareTo(Archivo f)
Compara la ruta del archivo con la del f y devuelve un entero de acuerdo a si es mayor,
menor o igual (numero positivo, negativo o cero respectivamente)
boolean createNewFile()
Crea un archivo nuevo y vacío con el nombre dado al construirse el objeto siempre y
cuando no exista aún.
booleano delete()
Elimina el archivo o directorio denotado por el objeto
void deleteOnExit()
Elimina el archivo o directorio denotado por el objeto al salir del programa
booleano existe()
Determina si el archivo o directorio denotado por el objeto existe
String getAbsolutePath()
Devuelve la ruta absoluta del archivo o directorio denotado por el objeto
Cadena getName()
Devuelve el nombre del archivo o directorio denotado por el objeto
String getParent()
Devuelve la ruta padre del archivo o directorio denotado por el objeto
boolean isDirectory()
Determina si la ruta dada al crear al objeto se refiere a un directorio
boolean isFile ()
Determina si la ruta dada al crear al objeto se refiere a un archivo
boolean isHidden ()
Determina si la ruta dada al crear al objeto se refiere a un archivo oculto
booleano lastModified()
Devuelve la cantidad de segundos desde las 00:00 del 1 de enero de 1970 que habían
transcurrido cuando se modifico por última vez
FUNDAMENTOS DE JAVA
boolean renameTo(Archivo X)
Le cambia el nombre al objeto denotado por el nombre almacenado en X
String toString()
Devuelve una cadena con el la ruta del archivo o directorio denotado
Directorios
Para manejar directorios con la clase File aparte de algunos métodos ya mencionados para
determinar si es un directorio existe el método:
String[] list()
el cual devuelve un arreglo de cadenas donde quedan almacenados los nombres de cada uno
de los archivos que contiene el directorio. Si este método se llama sobre un objeto File que no sea
un directorio se genera una excepción NullPointerException en tiempo de ejecución.
O bien si es una estructura jerárquica de directorios donde los de nivel mas alto todavía no
existen se usa el método:
Mkdirs booleanos()
FileNameFilter
A menudo se desea limitar el número de archivos devueltos por el método list para que se
incluyan únicamente aquellos archivos que cumplan un cierto patrón de nombre de archivo. Con
este fin, el paquete java.io incluye una interfaz llamada FileNameFilter. Un objeto de este tipo tiene
un solo método:
boolean accept(File dir, String nom)
el cual prueba si un archivo especificado debe ser incluido en la lista; el primer parámetro
contiene el directorio en el cual esta el archivo y el segundo es el nombre del archivo. Este método
debe devolver un valor true si se debe incluir el archivo en la lista o false si no. Este método en
realidad es solo una interfaz en el paquete java.io, lo cual significa que el código de tal método
debe ser realizado por uno mismo de acuerdo a lo que se quiere indicando que se va a implementar
la clase FileNameFilter. Por ejemplo, si queremos encontrar archivos de acuerdo a una extensión
especificada, entonces podemos hacer una clase a la cual se le pase la extensión deseada y que
determine si el archivo termina con esa extensión para ver si se acepta o no. Supongamos que la
clase se va a llamar porExt, entonces esta se definiría de la siguiente manera:
importar java.io.*;
public class porExt implements FileNameFilter {
String extension;
public porExt(String ext) { // Constructor de la clase
extension="." +ext;
}
FUNDAMENTOS DE JAVA
Una vez que se tiene esta clase, entonces se crea un objeto de clase FileNameFilter
llamando al constructor de porExt y se usa el siguiente método de la clase File:
String[] list(FileNameFilter filtro)
La cual es una variante del método list ya descrito pero que ahora solo va a poner en la lista
los archivos que son aceptados por la implementación específica de FileNameFilter (en este
ejemplo, por la clase porExt):
En el ejemplo anterior quedaría en s la lista de los archivos que tienen extensión .txt del
directorio raíz.
InputStream
Esta es una clase abstracta que define el modelo de Java para el flujo de entrada. Todos los
métodos de esta clase lanzarán una IOException (excepción de E/S) si se producen condiciones de
error. A continuación se muestran algunos de sus métodos:
int read()
Devuelve una representación como entero del siguiente byte de entrada disponible.
int skip(long n)
Omite n bytes de la entrada y devuelve el número de bytes que se han omitido
int disponible()
Devuelve el número de bytes de entrada disponibles actualmente para su lectura.
void close()
Cierra el origen de entrada. Los intentos de lectura posteriores generarán una IOException.
FUNDAMENTOS DE JAVA
void reset ()
Devuelve el puntero de entrada a la marca establecida previamente.
boolean markSupported()
Devuelve true si se admiten mark/reset en este flujo.
System.in
Esta clase es para leer del teclado y desciende de InputStream. Cuando se lee desde
System.in los caracteres uno a uno, la operación se realiza a través de un buffer. No se volverá de
una llamada de lectura de byte único hasta que se cierra el archivo o se introduzca un avance de
línea (\n). El ENTER se debe presionar para que la entrada pase al programa.
Flujo de salida
Igual que InputStream, esta es una clase abstracta que define un flujo de salida. Todos los
métodos de esta clase devuelven un valor void y lanzan una IOException en caso de error. Algunos
de los métodos que contiene son:
escribir(int b)
Escribe un byte especificado por el valor entero b.
write(byte b[])
Escribe un arreglo completo de bytes en el flujo de salida.
flush()
Inicializa el estado de la salida
cerrar()
Cierra el flujo de salida. Los intentos de escritura posteriores generarán una IOException.
FUNDAMENTOS DE JAVA
FileInputStream
Esta clase utiliza archivos de datos reales como base del flujo de entrada. Contiene dos
constructores:
FileInputStream(String nombrearchivo)
FileInputStream(Archivo f)
Cuando se crea un FileInputStream se abre para lectura, esta clase sobreescribe 6 de los
métodos de la clase abstracta InputStream. Si se intenta utilizar los métodos mark o reset se
generará una IOException.
FileOutputStream
Esta clase comparte el mismo estilo de constructorees que FileInputStream. Sin embargo, la
creación de FileOutputStram no depende de que el archivo ya exista. Esta clase crea el archivo
antes de abrirlo como salida cuando se crea el objeto, por lo tanto, si el archivo ya existe su
contenido se borra. Si se intenta abrir un archivo de solo lectura se lanzará una IOException.