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:
- Sin parámetros
java Ej1
- Poniendo un parámetro no numérico
java Ej1 pepe
- Poniendo un parámetro numérico
java Ej1 30Anotad 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:
- Para comprobar si no hay parámetros se capturará una excepción de tipo ArrayIndexOutOfBoundsException (para ver si el array de String que se pasa en el main tiene algún elemento).
- Para comprobar si el parámetro es numérico, se capturará una excepción de tipo NumberFormatException.
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 elegidaProbar 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.
- Al estar la clase de la excepción en el paquete usuarios, ¿qué línea deberemos añadir al conductor para que sea capaz de localizar dicha clase? Añadirla al código y compilar ¿Por qué da error de compilación?
- Añadir las líneas throw necesarias para lanzar las excepciones únicamente en los lugares indicados en el código de la función registraUsuario() y compilar. ¿Qué error da? ¿Por qué?
- Añadir a la declaración de la función registraUsuario() lo que sea necesario para que compile.
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.
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.
- Obtener el objeto Class mediante un forName(), pasándole como parámetro el nombre de la clase indicada. Por ejemplo:
Class c = Class.forName("MiClase1");
- Obtener un Object mediante un newInstance() del objeto Class obtenido:
Object o = c.newInstance();b) Llamar en Ej4 al método del objeto creado (tras crearlo) para que imprima el mensaje por pantalla.
- Obtener los métodos de la clase mediante el getMethods() del objeto Class:
Method[] metodos = c.getMethods();
- Invocar al primer método de la lista de métodos obtenida, pasándole como parámetros el objeto creado (objeto donde se llama al método), y los parámetros (que en este caso no utiliza):
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".
- Obtener el objeto Class mediante un forName(), pasándole como parámetro el nombre de la clase indicada. Por ejemplo:
Class c = Class.forName("MiClase2b");
- Obtener los constructores del objeto:
Constructor[] constructores = c.getDeclaredConstructors();- Construir el array de Object con los parámetros del constructor (en este caso sólo es un String):
Object[] parametros = {"Hola"};
- Crear un objeto con el constructor:
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".
- Obtener los métodos de la clase mediante el getMethods() del objeto Class:
Method[] metodos = c.getMethods();
- Construir el array de Object con los parámetros del método (en este caso sólo es un String):
Object[] parametros2 = {"Imprimiendo"};- Invocar al primer método de la lista de métodos obtenida, pasándole como parámetros el objeto creado (objeto donde se llama al método), y los parámetros (que en este caso no utiliza):
metodos[0].invoke(o, parametros2);
Para entregar: Debéis entregar un ZIP e2_1.zip con:
La excepción LoginInvalidoException creada en el paquete usuarios, y el programa Ej3.java con los cambios añadidos para poder probar la excepción.
El programa Ej4.java realizado.
El programa Ej5.java realizado.