Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … -
Ingeniería de la Programación
Práctica 2
2
Objetivos
Manejar excepciones en Java.
Utilizar clases que implementan colecciones de datos en memoria.
Programar la entrada/salida de datos por consola y fichero.
3
Contenidos
Manejo de excepciones.
Bibliotecas de Java
Paquete java.lang (núcleo principal de java)
Paquete java.util (utilidades, colecciones)
Paquete java.io (Entrada / Salida)
4
Manejo de excepciones Una excepción es una condición anormal que ocurre durante la
ejecución de un programa que interrumpe el flujo de ejecución normal.
Manejo de excepciones: método estructurado para capturar excepciones, es decir, para detectar y gestionar errores/situaciones anormales durante la ejecución de un programa.
Método donde ocurre una excepción/error
Método sin un manejador de excepción
Método con un manejador de excepción
main()
Llamada a método
Levanta una excepción
Transmite la excepción
Captura la excepción
5
Manejo de excepciones
Las excepciones son objetos de Java descendientes de la clase Throwable.
Existe un conjunto de excepciones predefinidas (explicado después), pero los programadores pueden definir excepciones nuevas en sus métodos.
Con la palabra throw se lanza una excepción, es decir, se crea un objeto (con información asociada al tipo de excepción) que se devuelve al método que hizo la llamada.
Cuando un método puede devolver excepciones éstas se declaran en su cabecera utilizando:
throws TipoExcepción1, TipoExcepción2
6
Manejo de excepciones
try {
llamada a método_m()
}
catch( Exception1 e) { ….. }
catch( Exception2 e) { ….. }
finally { ….. }
…
método_m() throws Exception1
{
throw new Exception1()
}
Bloque donde puede producirse una excepción
Manejadores
Bloque opcional
7
Manejo de excepciones: Jerarquía parcial
Object
Throwable
Error Exception
RuntimeExceptionVirtualMachineError
OutOfMemoryError
StackOverflowError
…
AWTError
…
NullPointerException
ClassCastException
…
IOException
…
8
Manejo de excepciones
Las excepciones que se lanzan o declaran explícitamente deben capturarse. Si no, el programa no compilará.
Las excepciones que no se capturan explícitamente pueden provocar que se detenga la ejecución del programa.
Existen dos categorías: Verificadas: el compilador obliga a su verificación.
Cualquier excepción definida por el programador y que se lanza explícitamente.
No Verificadas: el compilador no obliga a su verificación. Por ejemplo, Arithmetic Exception, NullPointerException, etc.
9
Manejo de excepciones try{ ... }
Marca un bloque de código donde puede producirse una excepción. Si se lanza una excepción el control se transfiere a un bloque catch.
catch( Excepción e ){ ... } Bloque de código que captura la excepción del tipo “Excepción”. Pueden definirse varios bloques catch para tratar distintas excepciones. Se ejecuta el primer bloque cuyo argumento es compatible.
finally{ ... } SIEMPRE se ejecuta, se lance o no una excepción en el bloque try. Código de finalización o de limpieza.
throw ObjetoExcepción Lanza explícitamente una excepción.
throws listaExcepciones Indica que un método A, que es llamado por un método B, puede generar
alguna excepción de la lista, pero no la captura. Será capturada por el método por el cual es llamado (método B). Sólo deben indicarse las excepciones “verificadas”. El resto no es
necesario.
10
class MiExcepcion extends Exception { int datoInformacion; // Constructor MiExcepcion( int datos ) { datoInformacion = datos; } // Sobreescribe el método getMessage() heredado de Throwable public String getMessage() { return( "La máxima es: Compra Barato, Vende Caro\n" +
"El valor de datoInformacion es: " + datoInformacion );
}}
Manejo de excepciones (Ejemplo1)
11
class ejEx01 { public static void main( String args[] ) { try { for( int cnt=0; cnt < 5; cnt++ ) {
if( cnt == 3 ) throw new MiExcepcion( 3 ); System.out.println( "Procesando datos para cnt = :" + cnt );
} System.out.println("Esta línea no debe ejecutarse nunca." ); } catch( MiExcepcion e ) { System.out.println("Controlador de Excepciones. ” +
e.getMessage() ); System.out.println("Controlador de Excepciones. Ejecutando
return." ); return; } finally { System.out.println(”Se entra independientemente de la
sentencia return del Controlador de Excepciones." ); } System.out.println( "Esta sentencia nunca se ejecutará debido
a la sentencia return del controlador de excepciones." );
}}
Manejo de excepciones (Ejemplo1)
12
Manejo de excepciones: uso de throws
class ejEx02 {
static void demoproc() throws NullPointerException {
// No sería necesario el throws
System.out.println( "Dentro de demoproc" );
throw new NullPointerException( "demo" );
}
public static void main( String args[] ) {
try {
demoproc();
}
catch( NullPointerException e ) {
System.out.println( “Capturo la excepción lanzada en demoproc: " + e );
}
}
}
13
Manejo de excepciones: uso de throws
class ejEx03 { static void demoproc() throws MiExcepcion {
// SÍ que sería necesario el throws System.out.println( "Dentro de demoproc" ); throw new MiExcepcion( 1 ); } public static void main( String args[] ) { try { demoproc(); } catch( MiExcepcion e ) { System.out.println( “Capturo la excepción lanzada
en demoproc: " + e ); } }}
14
La biblioteca de clases (paquetes)Plataforma Java 2 Standard Edition (J2SE)
java.lang Núcleo principal de Java.
java.util Utilidades de estructuras de datos.
java.io Entrada / Salida.
java.text Formato y adaptación a idiomas de texto, fechas y números.
java.math Operaciones aritméticas con enteros (BigInteger) y coma flotante (BigDecimal).
java.awt Componentes para el diseño de la interfaz de usuario y gestión de eventos.
javax.swing Nuevas componentes para el diseño de la interfaz de usuario (árbol, tabla, paneles, …).
15
La biblioteca de clases (paquetes)Plataforma Java 2 Standard Edition (J2SE)
javax Extensiones al lenguaje Java.
java.applet Creación de applets.
java.beans Desarrollo de componentes JavaBeans.
javax.xml Procesado de documentos XML.
java.sqljavax.sql
Compatibilidad para el acceso a base de datos y procesamiento de datos mediante JDBC.
java.rmi Programación distribuida.
javax.net Desarrollo de aplicaciones en red.
java.security Soporte para seguridad criptográfica.
16
Paquete java.lang
Este paquete contiene el núcleo principal de Java. Se importa automáticamente en los programas. Incluye entre otros elementos de utilidad:
Clases: java.lang.Object: es la clase raíz de la jerarquía de Java. Es la superclase
de cualquier clase. java.lang.Class: instancias de Class son las clases, interfaces, tipos
primitivos y arrays de un programa en tiempo de ejecución. java.lang.System: contiene atributos y métodos de clase útiles. java.lang.Math: contiene métodos para realizar operaciones matemáticas
básicas java.lang.String: instancias de String son cadenas de caracteres. Integer, Float, Double, …: clases que encapsulan tipos primitivos.
Interfaces: Cloneable, Runnable, Comparable, …
Excepciones: Throwable, Exception, ArithmeticException, ArrayIndexOutOfBoundsException,
NullPointerException, …
17
java.lang.Object
Raíz de la jerarquía de clases Es la superclase de cualquier clase creada por el programador Define los siguientes métodos que son heredados por la clases derivadas
Object clone(): crea y devuelve una copia ‘superficial’ de un objeto. boolean equals(Object obj): indica si dos referencias apuntan al mismo
objeto. String toString(): devuelve una cadena con el nombre de la clase y el
código (hash) del objeto. Normalmente las clases derivadas redefinen este método para mostrar información acerca del objeto.
Class getClass(): devuelve la clase en tiempo de ejecución de un objeto. System.out.print(c.getClass.getName()) mostraría el nombre de la clase a la que pertenece c.
int hashCode(): devuelve el código hash de un objeto. Objetos “iguales” deben tener códigos iguales.
void finalize(): es el método invocado por el garbage collector de Java cuando el objeto ya no es accesible. Puede ser redefinido por el programador para liberar otros recursos (p.e. cerrar archivos).
18
java.lang.Object (Ejemplo2)
package Figuras;
public class Circulo extends Figura implements Cloneable{ … public Object clone() throws CloneNotSupportedException{ return super.clone(); } public String toString(){ String s= "posx= " + x + " posy= " + y + " radio= " +radio; return s + " hash: " + this.hashCode(); } …}
Para clonar un objeto:
• Indicar que se implementa la interfaz Cloneable
• Redefinir método clone() llamando al método clone de la clase base
• Capturar la excepción CloneNotSupportedException
• El objeto devuelto se promociona al tipo esperado (cast)
19
java.lang.Object (Ejemplo2_1.java)
import Figuras.Circulo;public class Ejemplo2_1 {public static void main(String[] args) { Circulo c1 = new Circulo(100,100,50); Circulo c2; try { c2 = (Circulo) c1.clone();
if (c1.equals(c2)) System.out.println("C1 = C2"); else System.out.println("C1 != C2");
System.out.println("C1: " + c1); System.out.println("C2: " + c2); } catch (CloneNotSupportedException e) { System.out.println("No se puede clonar este objeto.");}}}
C1 y C2 son distintos
El código hash es diferente
Sus atributos valen lo mismo: tanto tipos primitivos, como arrays o referencias.
System.out.println("C1: " + c1)
es equivalente a
System.out.println("C1: " + c1.toString())
20
java.lang.Math
Métodos estáticos que implementan funciones matemáticas. double sin(double ), double cos(double ), double tan(double ),
double exp(double ), double log(double ), double pow(double ,
double ),
int max(int, int), float max(float, float ), double max(double,
double ),
int min(int, int), float min(float, float ), double min(double,
double ),
int abs(int ), float abs(float ), double abs(double ),
double random(), double sqrt(double ), int round(float ), long
round(double ).
Constantes:
PI, E
21
La clase String se utiliza para representar cadenas de caracteres.
Son constantes, por lo que su valor no cambia una vez creadas."...", String(), String(String str), String(char [] str)
int length(): devuelve la longitud en caracteres de la cadena.
String trim(): Elimina blancos, tabuladores y caract. de control al final de la cadena
char charAt(int indice): devuelve el carácter en la posición indice.
String substring(int inicio, int fin): devuelve una subcadena entre las posiciones inicio y fin.
boolean equals(String str): s1.equals(s2) devuelve true si s1 y s2 guardan la misma cadena.
int compareTo(String str): s1.compareTo(s2) devuelve 0 si s1 y s2 guardan la misma cadena, un entero negativo si s1 < s2 y un entero positivo si s1 > s2.
int indexOf(int ch): devuelve la posición de la primera ocurrencia de ch.
String concat(String str): concatena dos cadenas.
String toLowerCase(): transforma los caracteres a minúsculas.
String toUpperCase(): transforma los caracteres a mayúsculas.
…
java.lang.String
22
java.lang.String (Ejemplo2_2.java)
String s1 = "Hola mundo.";
String s3 = s1;
String s2 = new String("Hola mundo.");
if (s1==s3) System.out.println("El mismo objeto cadena!");
if (s1.equals(s2)) System.out.println("Cadenas Iguales!");
System.out.println("La longitud de s1 es: " + s1.length());
System.out.println("El carácter en la posición 3 es: " + s1.charAt(3));
System.out.println("El carácter 'a' está en la posición: " + s1.indexOf('a'));
s2= s2.concat(" Adiós"); // s2 <- “Hola mundo. Adiós”
String s4="Hola mundo".substring(2,4); //s4 <- ”la”
23
La clase StringBuffer también guarda cadenas de caracteres.
Puede modificarse el contenido o la capacidad del objeto.StringBuffer(), StringBuffer(String str), StringBuffer(int long)
void setLength(int nuevaLong)
void setCharAt(int indice, char ch): sustituye el carácter en la posición indice por ch
void insert(int posicion, tipo dato): inserta la representación en cadena del dato a partir de la posición indicada.
int capacity(): capacidad máxima de la cadena.
void append(tipo dato): añade la representación en cadena del argumento al final.
String toString( ): devuelve un objeto String que guarda la misma cadena
java.lang.StringBuffer
StringBuffer sb1 = new StringBuffer(20);
int c=sb1.capacity(); // i <- 20
int l=sb1.length(); // l <- 0
sb1.append("Hoa a Todos"); // s1 <- "Hoa a Todos"l=sb1.length(); // l <- 11 sb1.insert(2,'l'); // s1 <- "Hola a Todos"
24
Clases “envoltorio”
Las clases “envoltorio” encapsulan un tipo primitivo de datos. Boolean, Byte, Character, Double, Float, Integer, Long, Short.
Cada clase proporciona métodos que devuelven el tipo primitivo. char charValue() int intValue() float floatValue() ...
Proporcionan algunos métodos estándares clone(), toString(), compareTo()
Constantes de clase p.e. MAX_VALUE, MIN_VALUE, en Integer.
Métodos de clase Convertir de número a cadena:
String toString(int i), devuelve el objeto String que representa al entero i Convertir de cadena a número:
int parseInt(String s), devuelve el valor entero correspondiente a s Integer valueOf(String s), devuelve el objeto Integer correspondiente a s
25
Ejemplo Clases “envoltorio” (Ejemplo2_2.java)
String s_ent = Integer.toString(1234);
String s_real = Double.toString(123.4);
String s5="123a";
String s6="123a";
try {
int i = Integer.parseInt("123");
double d = Double.parseDouble("123,4");// error de formato
}
catch (NumberFormatException e) {
System.out.println(“No es un valor numérico");
}
26
java.lang.System
La clase System proporciona algunos atributos y métodos de clase útiles. No puede ser instanciada.
Atributos de clase. static InputStream in: entrada estándar static PrintStream out: salida estándar static PrintStream err: salida de error
Métodos de clase static long currentTimeMillis(): devuelve el tiempo en milisegundos
desde 1/1/1970 static void exit(int status): termina la ejecución del programa. static Properties getProperties(): obtiene las propiedades del
sistema (versión de JRE, classpath, sistema operativo, usuario, etc.) static void arraycopy(Object src, int srcPos, Object dest,
int destPos, int length): utilidad para copiar arrays. static void setIn(InputStream in): reasigna la entrada estándar. static void setOut(PrintStream out): reasigna la salida estándar. static void setErr(PrintStream err): reasigna la salida de error.
…
27
Paquete java.util
Utilidades para arrays Colecciones de datos Modelo de eventos Fecha y hora Internacionalización Otras (tokenizadores, generador de números
aleatorios, …)
28
Paquete java.util (Colecciones de datos)
java.util.Arrays Utilidades para manipulación de arrays: ordenación, búsqueda,
copia y comparación. java.util.ArrayList
Lista indexada redimensionable de objetos Implementa las interfaces List, Cloneable y Serializable No está sincronizada, el programador debe controlar la
ejecución concurrente de varios threads sobre la lista java.util.HashSet
Conjunto de objetos que no se pueden repetir Implementa las interfaces Set, Cloneable y Serializable Utiliza una tabla Hash. Coste de inserción, borrado y búsqueda
constante java.util.TreeSet
Conjunto implementado con una estructura de árbol. Coste de inserción, borrado y búsqueda logarítmico.
Implementa las interfaces Set, Cloneable y Serializable
29
Paquete java.util
java.util.Vector: Lista indexada de objetos redimensionables. Implementa las interfaces List, Cloneable y Serializable. Está sincronizada.
java.util.Hashtable: Implementación de un mapa mediante tablas de
dispersión. Implementa Map, Clonable y Serializable Asocia claves con valores que pueden ser cualquier
objeto.
Interface java.util.Iterator: ofrece métodos para recorrer una colección de objetos.
30
Clase java.util.ArrayList<E>
ArrayList(), ArrayList(int capacidad_inicial)
boolean add (Object obj), boolean add(int indice, E obj)
void clear()
Object clone(), Object[] toArray()
boolean contains(Object obj)
E get(int i)
int indexOf(Object e), int lastIndexOf(Object e)
boolean isEmpty(),
E remove(int index), boolean remove(Object obj)
E setElementAt(int index, E obj)
int size()
Iterator iterator()
31
Clase java.util.Vector
Vector(), Vector(int capacidad), Vector(int capacidad, int incremento)
void addElement(Object obj)
boolean removeElement(Object obj)
void removeAllElements()
Object clone(), void copyInto(Object anArray [])
int capacity(), int size(), boolean isEmpty(), void setSize(int newSz)
boolean contains(Object obj)
int indexOf(Object e, int ind), int lastIndexOf(Object e, int ind)
Object elementAt(int index)
Object firstElement(), Object lastElement()
void setElementAt(Object obj, int index)
void removeElementAt(int index)
void insertElementAt(Object obj, int index)
Iterator iterator()
32
Clase java.util.Hashtable
Hashtable(), Hashtable(int nElementos),
Hashtable(int nElementos, float factorCarga)
int size(), boolean isEmpty()
Enumeration keys(), Enumeration elements()
boolean contains(Object value),
boolean containsKey(Object key)
Object get(Object key)
void rehash()
Object put(Object key, Object value)
Object remove(Object key)
void clear()
Object clone()
String toString()
33
Interface java.util.Iterator
Facilita el recorrido de las estructuras de datos. Ofrece dos métodos:
public boolean hasNext () public Object next ()
Lanza la excepción NoSuchElementException si no hay más elementos
public void remove() Borra el último elemento devuelto por next() de la colección Lanza la excepción UnsupportedOperationException si la
colección no soporta esta operación Lanza la excepción IllegalStateException si no se ha llamado
a next() o se llama dos veces seguidas a remove().
Los objetos de la enumeración sólo se pueden usar una vez. No se puede retroceder a elementos anteriores.
34
Ejemplo colección ArrayList (Ejemplo2_3.java)
import java.util.ArrayList;import java.util.Iterator;
public class Ejemplo2_3 {public static void main(String[] arg){...
ArrayList v = new ArrayList();for (int i=0; i<10; i++) {
v.add(new Integer(i));}
// Lista los elementos del vector usando IteratorIterator it = v.iterator();while (it.hasNext ()) {
System.out.print(it.next() + ", ");}System.out.println(); // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
// Lista los elementos del vector usando get(int index)for (int i=0; i<v.size(); i++) {
System.out.print(v.get(i) + ", ");}System.out.println(); // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
// Imprime la representación del vector como cadenaSystem.out.print(v.toString()); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
...}}
35
Entrada / Salida (Flujos de bytes)
Las clases para manejar la E/S derivan de las clases
abstractas InputStream y OutputStream.
Flujos de bytes (byte streams): secuencias de bytes que
se escriben (leen) en (desde) dispositivos externos.
En caso de error en la E/S, los métodos generan la excepción
IOExcepcion. El programador debe escribir el código
necesario para capturarla. P. e. si la fuente de datos no está disponible: el fichero no
existe, o no tiene permisos de escritura, etc.
FileInputStream y FileOutputStream permiten la lectura y
escritura de bytes en ficheros, respectivamente.
36
Ejemplo flujo de bytes (Ejemplo3, CopiarBytes.java)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopiarBytes {
public static void main(String[] args) throws IOException{
FileInputStream entrada=null;
FileOutputStream salida=null;
try {
entrada= new FileInputStream("entrada.txt");
salida= new FileOutputStream("salida.txt");
int c;
while ((c=entrada.read())!=-1){
salida.write(c);
}
} catch(IOException e) {
System.out.println(e.getMessage());
} finally{
if (entrada!=null){ entrada.close(); }
if (salida!=null){ salida.close(); }
}
}
}
close() en el bloque finally garantiza que se cierra el stream
read() devuelve -1 cuando alcanza el final del stream
37
Flujos de caracteres
Las clases que manejan flujos de caracteres transforman los bytes en caracteres según el juego de caracteres especificado.
InputStreamReader y OutputStreamWriter son de propósito general.
FileReader y FileWriter son orientadas a fichero y transforman bytes en caracteres según el juego de caracteres local.
InputStreamReader y OutputStreamWriter permiten especificar el juego de caracteres. Se definen sobre un flujo de bytes.
InputStreamReader in = new InputStreamReader (new FileInputStream (“fichero”));
38
Ejemplo flujos de caracteres (Ejemplo3, CopiarCaracteres.java)
import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;
public class CopiarCaracteres {
public static void main(String[] args) throws IOException{
FileReader entrada=null;
FileWriter salida=null;
try {
entrada= new FileReader("entrada.txt");
salida= new FileWriter("salida_car.txt");
int c;
while ((c=entrada.read())!=-1){
salida.write(c);
}
} catch(IOException e) {
System.out.println(e.getMessage());
} finally{
if (entrada!=null){ entrada.close(); }
if (salida!=null){ salida.close(); }
}
}}
La variable entera c guarda un carácter (16 bits)
39
E/S orientada a líneas
Las clases BufferedReader y PrintWriter están diseñadas para leer y escribir líneas de texto, respectivamente.
Independientes del terminador de línea (“\r”, “\n”, “\r\n”) Se definen sobre un flujo de caracteres (FileReader, FileWriter).
40
Ejemplo E/S orientada a líneas (Ejemplo3, CopiarLineas.java)
import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.io.BufferedReader;
public class CopiarLineas {
public static void main(String[] args) throws IOException{
BufferedReader entrada=null;
PrintWriter salida=null;
try {
entrada= new BufferedReader(new FileReader("entrada.txt"));
salida= new PrintWriter(new FileWriter("salida_lin.txt"));
String l;
while ((l=entrada.readLine())!=null){
salida.println(l);
}
} catch(IOException e) {
System.out.println(e.getMessage());
} finally{
if (entrada!=null){ entrada.close(); }
if (salida!=null){ salida.close(); }
}
}
}
readLine() lee una línea.null indica el final del fichero println() escribe una línea añadiendo el terminador de línea.
41
E/S por consola
System.in : Objeto de la clase InputStream. Representa el flujo de entrada estándar (teclado). System.in.read(): lee el siguiente byte.
System.out: Objeto de la clase PrintStream. Representa el flujo de salida estándar (pantalla). System.out.print() y System.out.println(): métodos sobrecargados
para escribir caracteres.
System.err: Objeto de la clase PrintStream. Representa el flujo de salida de error. System.err.print() y System.err.println().
42
Ejemplos E/S estándar (Ejemplo3, LeerCadena.java)
Leer una cadena de la entrada estándar
import java.io.BufferedReader;import java.io.InputStreamReader;
public class LeerCadena {public static void main(String[] args) {
BufferedReader in= new BufferedReader(new InputStreamReader(System.in));String s="";System.out.println("Escriba su nombre: ");try{
s=in.readLine();}catch(Exception E){ s = ""; } System.out.println("Su nombre es: " + s);
}}
43
Ejemplos E/S estándar (Ejemplo3, LeerEntero.java)
Leer un entero de la entrada estándar
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.IOException;
public class LeerEntero {public static void main(String[] args) {
BufferedReader in= new BufferedReader(new InputStreamReader(System.in));String s="";int edad=0;System.out.println("Escriba su edad: ");try{
edad=Integer.parseInt(in.readLine().trim());} catch(NumberFormatException e){
System.out.println("No es un entero."); }
catch (IOException e){System.out.println("Error.");
}System.out.println("Su edad es: " + edad);
}}
44
Clase java.util.Scanner
Divide la cadena de entrada en tokens separados por un delimitador(espacio en blanco por defecto). El token resultante puede convertirse a un tipo básico utilizando el correspondiente método next.
Un objeto de la clase Scanner se construye sobre un flujo de caracteres, un fichero (File) o sobre la entrada estándar (System.in).
public void Scanner(File source); public void Scanner(InputStream source): construye un objeto Scanner.
public bool hasNext(): devuelve cierto si quedan tokens en la cadena. hasNextDouble(), hasNextInt(), …: devuelven true si el siguiente
token es del tipo esperado. public String next(): devuelve el siguiente token (String) public double nextDouble(), public int nextInt(), …: devuelven
el siguiente token convertido al tipo indicado. public void useDelimiter(String s): modifica mediante una exp.
regular el conjunto de delimitadores. public void useLocale(Locale l): modifica el formato numérico local.
45
Clase java.util.Scanner (Ejemplo 3, EscanearTeclado.java)
import java.util.InputMismatchException;
import java.util.Scanner;
public class EscaneaTeclado {
public static void main(String[] args) {
Scanner s=null;
try{
s=new Scanner(System.in);
System.out.println("Introduce nombre:");
String nombre = s.nextLine();
System.out.println("Introduce edad:");
int edad= s.nextInt();
System.out.println("Nombre:" + nombre);
System.out.println("Edad:" + edad);
}
catch (InputMismatchException e){
System.out.println("Dato incorrecto");
}
}
}
46
Formatear la salida
Método format() de PrintWriter (flujo de caracteres) y PrintStream (flujo de bytes).
Una cadena con especificadores de formato y la lista de argumentos.
System.out.format(“La raíz cuadrada de %d es %f. %n”, n, r);
Algunos tipos de especificadores de formato: %d entero %f reales %s cadenas %n terminador de línea (independiente de la plataforma)
47
Formatear la salida
Elementos opcionales (de izq. a dcha.) Índice del argumento con el que empareja el especificador de
formato. Flags:
+: número con signo Carácter de relleno -: alinea a la derecha ,: formato de número con separadores decimales locales.
Anchura mínima, por defecto se alinea a la izquierda. Precisión: para reales es la precisión matemática, para cadenas
es la anchura máxima. Se trunca por la derecha.
Ejemplo: System.out.format (“%f, %1$+020.10f”, Math.PI) Salida: 3,141593, +0000000003,1415926536
48
Flujos de objetos: “Serialización”
Permite hacer los objetos persistentes, es decir, almacenar objetos en archivos, para poder recuperarlos en otro momento.
Para “serializar” una clase, ésta debe implementar la interfaz Serializable (java.io).
ObjectOutputStream es el flujo de objetos de salida que se definen sobre FileOutputStream.
ObjectOutputStream(FileOutputStream fich);
writeObject(Object obj);
ObjectInputStream es el flujo de objetos de entrada que se define sobre FileInputStream.
ObjectInputStream(FileInputStream fich);
Object readObject();
La lectura de los objetos desde el archivo debe realizarse en el mismo orden en que se han escrito .
49
Ejemplo de “Serialización” (Ejemplo 3, Serializacion.java)
import java.util.ArrayList;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import Figuras.Circulo;
public class Serializacion {static ArrayList v;static void GuardarVector(){ try { ObjectOutputStream objout =
new ObjectOutputStream ( new FileOutputStream("prueba.dat"));objout.writeObject(v);objout.close();System.out.println("Archivo guardado.");
} catch (IOException e) { System.out.println("Error guardando archivo: "); }}
50
Ejemplo de “Serialización” (Ejemplo 3, Serializacion.java)
static void LeerVector(){ try { ObjectInputStream objin =
New ObjectInputStream (new FileInputStream("prueba.dat")); v= (ArrayList) objin.readObject(); objin.close(); System.out.println("Archivo leído.");}
catch (ClassNotFoundException e) { System.out.println("Error!"); } catch (IOException ex) { System.out.println("Error abriendo archivo: "); }
}
51
Ejemplo de “Serialización” (Ejemplo 3, Serializacion.java)
public static void main(String[] args) { v = new ArrayList(); // ArrayList ya implementa Serializable
for (int i=0;i<10;i++){Circulo c = new Circulo(1,1,i); v.add(c);
}GuardarVector();v.clear(); //borra los elementos del arrayLeerVector();for (int i=0;i<v.size();i++){
((Circulo) v.get(i)).dibujar();}
}}
public class Circulo extends Figura implements Serializable{
Los objetos del Array (Circulo) deben definirse como “serializables”
52
Ejercicio: Servicio de Mantenimiento
Cree un proyecto nuevo llamado “GestionActivos” Cree el paquete “dominio” que contendrá las clases
del dominio y la lógica de la aplicación. Clase Maquina (fichero Maquina.java)
con los atributos: número (int), marca, modelo, numSerie, observaciones (String),
con un constructor que inicialice los atributos Menú contextual de eclipse: source -> Generate Constructor
using fields Métodos set y get para cada atributo
Menú contextual de eclipse: source -> Generate getters and setters
Redefina el método toString() para que devuelva en una cadena los valores de los atributos de una instancia.
53
Ejercicio Servicio de Mantenimiento
Clase GestionMaquinas (fichero GestionMaquinas.java) Clase que maneja la lista de avisos de incidencias, que será un
atributo privado de tipo ArrayList. Con getter y setter para su atributo lista. Con los métodos:
void addMaquina(Maquina m) throws MaquinaYaExiste: añade una nueva Máquina a la lista. En caso de que exista ya una máquina con el mismo número, no la añade y lanza la excepción MaquinaYaExiste.
Maquina getMaquinaPorNumero(int num): devuelve la Máquina de la lista cuyo número sea num.
void borraMaquinaPorNumero(int num): borra la Máquina de la lista cuyo número sea num.
void guardaListaMaquinas(String fichero): serializa los objetos de la lista en un fichero.
void cargaListaMaquinas(String fichero): carga en memoria la lista de avisos guardada previamente en un fichero.
Recuerde indicar en la declaración de Maquina que implementa la interfaz Serializable
54
Ejercicio Servicio de Mantenimiento
Cree el paquete "excepciones" e incluya las excepciones que considere necesarias, p.e.
Clase MaquinaYaExiste (fichero MaquinaYaExiste.java)
Clase que extiende Exception Con constructor vacío. Redefinir el método String getMessage()para que
devuelva el mensaje asociado a la excepción.
55
Ejercicio Servicio de Mantenimiento
Cree el paquete "interfaz" que incluirá las clases relacionadas con la interfaz de la aplicación con el usuario.
Clase Menu (archivo Menu.java) Con los atributos:
Titulo del menú (string) Lista de opciones de menú (ArrayList)
Con constructor que inicialice los atributos. Con los métodos:
public void escribirMenu(): visualiza por consola el menú de la aplicación.
public int getOption(): devuelve la opción introducida por teclado.
56
Ejercicio Servicio de Mantenimiento Las opciones del menú serán las siguientes:
1.- Introducir Máquina
2.- Listar Máquinas
3.- Recuperar Máquina por número
4.- Borrar Máquina por número
5.- Guardar Archivo de Incidencias
6.- Cargar Archivo de Incidencias
0.- Salir
Clase PrincipalConsola (archivo PrincipalConsola.java) Inicializa el menú de la aplicación y lo muestra en pantalla.
Pide al usuario los datos necesarios para cada una de las opciones del menú e invoca al método de la clase GestionMaquinas que implementa la funcionalidad requerida.
Realiza las validaciones sintácticas necesarias sobre los datos (datos tipo int o date) y en caso de error informa al usuario.