Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
2
respuestas

[Bug] Bug en el ejercicio propuesto por el post creando anotaciones

java: unreported exception java.lang.IllegalAccessException; must be caught or declared to be thrown

clase Usuario

package com.aluracurso.anotaciones.models;

import java.lang.reflect.Field; import java.time.LocalDate; import java.time.Period;

public class Usuario { private String nombre; private String identidad; @EdadMinima(valor = 18) private LocalDate fechaNacimiento;

public Usuario(String nombre, String identidad, LocalDate fechaNacimiento) {
    this.nombre = nombre;
    this.identidad = identidad;
    this.fechaNacimiento = fechaNacimiento;
}

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

public String getIdentidad() {
    return identidad;
}

public void setIdentidad(String identidad) {
    this.identidad = identidad;
}

public LocalDate getFechaNacimiento() {
    return fechaNacimiento;
}

public void setFechaNacimiento(LocalDate fechaNacimiento) {
    this.fechaNacimiento = fechaNacimiento;
}

public boolean usuarioValido(Usuario usuario){
    if(!usuario.getNombre().matches("[a-zA-Záàâãéèêíïóôõöúçñ\\s]+")){
        return false;
    }
    if(!usuario.getIdentidad().matches("[^0-9]+")){
        return false;
    }
    return Period.between(usuario.getFechaNacimiento(), LocalDate.now()).getYears() >= 18;
}
/**uso de Generics permitirá recibir un objeto de cualquier tipo*/
public static <T> boolean validador( T objeto ) throws IllegalAccessException {
    //operar la clase referente al tipo del objeto recibido
    Class <?> clase = objeto.getClass();
    //iteraremos sobre los atributos de la clase utilizando el método getDeclaredFields():
    for (Field field : clase.getDeclaredFields()){
        /*averiguar qué campo está anotado con nuestra anotación. isAnnotationPresent(): este método comprueba si el campo
        * contiene la anotación pasada y devuelve un boolean*/
        if (field.isAnnotationPresent(EdadMinima.class));
            //recoger nuestra anotacion con getAnnotation()
            EdadMinima edadMinima = field.getAnnotation(EdadMinima.class);
            try{
                //Obtener edad pasada por el usuarios
                field.setAccessible(true);
                // se recibe la fecha de nacimiento
                LocalDate fechaNacimiento = (LocalDate) field.get(objeto);
                /**Between(): toma como parámetro dos fechas para ser comparadas,
                 * el método now() para obtener la fecha actual y
                 * el método getYears():para saber el valor del período en años **/
                return Period.between(fechaNacimiento, LocalDate.now()).getYears() >= edadMinima.valor();

            }catch (IllegalAccessException e){
                e.printStackTrace();
            }
    }
    return false;
}

} clase Main package com.aluracurso.anotaciones.models;

import java.time.LocalDate; import java.time.Month;

import static com.aluracurso.anotaciones.models.Usuario.validador;

public class PrincipalAnotaciones { public static void main(String[] args) { Usuario usuario = new Usuario("Maria", "52902488033", LocalDate.of(2005, Month.JANUARY, 13)); System.out.println(validador(usuario)); } }


Anotación EdadMedia package com.aluracurso.anotaciones.models;

import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;

@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface EdadMinima { int valor(); }

2 respuestas
solución!

¡Hola Luisa, espero que estés bien!

Entiendo que estás teniendo un problema con un ejercicio que implica el uso de anotaciones en Java. El error que estás viendo, "java: unreported exception java.lang.IllegalAccessException; must be caught or declared to be thrown", se debe a que estás utilizando un método que puede lanzar una excepción pero no estás manejando esa excepción de ninguna manera.

En el método validador de la clase Usuario, estás utilizando field.get(objeto) y Period.between(fechaNacimiento, LocalDate.now()).getYears(), ambos métodos pueden lanzar una excepción del tipo IllegalAccessException. Por lo tanto, debes envolver estas líneas de código con un bloque try-catch o declarar que el método validador puede lanzar esta excepción.

Aquí te muestro cómo podrías manejar la excepción dentro del método validador:

public static <T> boolean validador( T objeto ) {
    Class <?> clase = objeto.getClass();
    for (Field field : clase.getDeclaredFields()){
        if (field.isAnnotationPresent(EdadMinima.class)){
            EdadMinima edadMinima = field.getAnnotation(EdadMinima.class);
            try{
                field.setAccessible(true);
                LocalDate fechaNacimiento = (LocalDate) field.get(objeto);
                return Period.between(fechaNacimiento, LocalDate.now()).getYears() >= edadMinima.valor();
            }catch (IllegalAccessException e){
                e.printStackTrace();
                // Aquí podrías manejar la excepción de una manera específica o lanzarla nuevamente si es necesario
                return false; // Por ejemplo, podrías retornar false en caso de excepción
            }
        }
    }
    return false;
}

Al manejar la excepción dentro del método validador, evitarás que el error "unreported exception java.lang.IllegalAccessException" aparezca.

Espero que esta solución te ayude a resolver tu problema. ¡Buena suerte con tu ejercicio de Java!

Espero haber ayudado y buenos estudios!

Pude solucionar el error con el return, pero también me hacia falta la llave de la condición. Muchas gracias