Excepciones

1. El fichero Ej1.java es un programa que toma un número como parámetro, y como salida muestra el logaritmo de dicho número. Sin embargo, en ningún momento comprueba si se ha proporcionado algún parámetro, ni si ese parámetro es un número. Se pide:

a) Compilar el programa y ejecutadlo de tres formas distintas:

java Ej1 
java Ej1 pepe
java Ej1 30

Anotad las excepciones que se lanzan en cada caso (si se lanzan)

b) Modificar el código de main() para que capture las excepciones producidas y muestre los errores correspondientes en cada caso:

Así, tendremos en el main() algo como:

try
{
	// Tomar parámetro y asignarlo a un double
} catch (ArrayIndexOutOfBoundsException e1) {
	// Codigo a realizar si no hay parametros
} catch (NumberFormatException e2) {
	// Codigo a realizar con parametro no numerico
}

Probad de nuevo el programa igual que en el caso anterior comprobando que las excepciones son capturadas y tratadas.

2.  El fichero Ej2.java es similar al anterior, aunque ahora no vamos a tratar las excepciones del main(), sino las del método logaritmo(): en la función que calcula el logaritmo se comprueba si el valor introducido es menor o igual que 0, ya que para estos valores la función logaritmo no está definida. Se pide:

a) Buscar entre las excepciones de Java la más adecuada para lanzar en este caso, que indique que a un método se le ha pasado un argumento ilegal. (Pista: Buscar entre las clases derivadas de Exception. En este caso la más adecuada se encuentra entre las derivadas de RuntimeException).

b) Una vez elegida la excepción adecuada, añadir código (en el método logaritmo()) para que en el caso de haber introducido un parámetro incorrecto se lance dicha excepción. 

throw new ... // excepcion elegida

Probar el programa para comprobar el efecto que tiene el lanzamiento de la excepción.

c) Al no ser una excepción del tipo checked no hará falta que la capturemos ni que declaremos que puede ser lanzada. Vamos a crear nuestro propio tipo de excepción derivada de Exception (de tipo checked) para ser lanzada en caso de introducir un valor no válido como parámetro. La excepción se llamará WrongParameterException y tendrá la siguiente forma:

public class WrongParameterException extends Exception 
{
	public WrongParameterException(String msg) {
		super(msg);
	}
}

Deberemos lanzarla en lugar de la escogida en el punto anterior. 

throw new WrongParameterException(...);

Intentar compilar el programa y observar los errores que aparecen. ¿Por qué ocurre esto? Añadir los elementos necesarios al código para que compile y probarlo. 

3. (CHAT) Durante el curso vamos a construir una aplicación de chat, en la que los usuarios deberán registrarse antes de poder entrar. Para ello tendremos una función registraUsuario(login, password) que añadirá el usuario a la base de datos. Cuando llamemos a esta función puede ocurrir que se registre el usuario, o bien que haya algún error como que el login esté repetido o sea un login no válido (p.ej cadena vacía). En el caso de error nos interesará conocer cuál ha sido la causa del error para poder comunicárselo al usuario. 

Se pide:

a) Implementar una nueva excepción LoginInvalidoException contenida en un subpaquete usuarios (más adelante iremos añadiendo otras clases a este paquete). Esta excepción tomará en el constructor una cadena en la que se indicará el mensaje de error producido. Si nos fijamos en la clase Exception de la que hereda, vemos que tiene un constructor a partir del mensaje de error. También la excepción WrongParameterException hecha en el ejercicio anterior lo utiliza. ¿Qué instrucción deberemos usar para utilizar dicho constructor desde la subclase? Implementar y compilar la nueva excepción (podéis fijaros en WrongParameterException para hacer la nueva, teniendo en cuenta que debe ser del paquete usuarios).

b) Esta clase es sólo un componente de nuestra futura aplicación de chat que vamos a construir. Para poder probar estos componentes individuales sin tener la aplicación completa utilizaremos lo que denominamos un conductor que será código provisional lo más simple posible que nos permita probar todas las funcionalidades de nuestro módulo. En este caso nuestro conductor estará en el fichero Ej3.java.

Probar el programa. Se le pasan como parámetro el login y password que se pasan a registraUsuario(). Variando estos parámetros podréis comprobar los mensajes que se pueden mostrar, y el comportamiento de la excepción creada.

 

Reflection

4. Tenemos hechas las clases MiClase1 y MiClase2. Ambas tienen un constructor sin parámetros, y un solo método llamado imprime() que saca un mensaje por pantalla (distinto para cada clase). El programa Ej4.java acepta como único parámetro el nombre de una de estas dos clases (MiClase1 o MiClase2).

Se pide:

a) Hacer que Ej4 cree en tiempo de ejecución una instancia de un objeto de la clase que se le pasa como parámetro.

Class c = Class.forName("MiClase1");
Object o = c.newInstance();

b) Llamar en Ej4 al método del objeto creado (tras crearlo) para que imprima el mensaje por pantalla.

Method[] metodos = c.getMethods();
metodos[0].invoke(o, null);

 

5. Se tienen las clases MiClase1b y MiClase2b, que son como las anteriores MiClase1 y MiClase2 respectivamente, pero pasándole un parámetro String tanto al constructor como al método imprime(). El programa Ej5.java acepta como parámetro el nombre de una de las dos clases (MiClase1b o MiClase2b).

Se pide:

a) Crear en tiempo de ejecución una instancia de un objeto de la clase que se le pasa como parámetro, utilizando el nuevo constructor, y pasándole como parámetro al mismo la cadena "Hola".

Class c = Class.forName("MiClase2b");
Object[] parametros = {"Hola"};
Object o = 
     constructores[0].newInstance(parametros);

b) Llamar al método del objeto creado (el método que acepta una cadena) pasándole como parámetro la cadena "Imprimir".

Method[] metodos = c.getMethods();
metodos[0].invoke(o, parametros2);

 

Para entregar: Debéis entregar un ZIP e2_1.zip con: