1

Estoy tratando de hacer una actividad con excepciones en la que tengo una clase persona que guarda los datos de nombre, apellidos, email, código postal, etc.

Esta misma clase al mismo tiempo es usada por otra clase que será la que cree las personas en esta clase tengo un método que lanza la excepción creada en otro objeto anteriormente.

Clase de la excepcion InvalidInputException

public final class InvalidInputException extends Exception {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private String messageErrorList[];

    public InvalidInputException(String[] errorList) {

    }

    public String[] getMessageErrorList() {
        return messageErrorList;
    }

    public void setMessageErrorList(String[] messageErrorList) {
        this.messageErrorList = messageErrorList;
    }

}

Metodo de la clase para crear personas

Scanner lector = new Scanner(System.in);
    private ArrayList<String> errorList;
    Act18Validator validar = new Act18Validator();



    public AlumnesFactory(Scanner lector, Act18Validator validar) {
        this.lector = lector;
        this.errorList = new ArrayList<>();
        this.validar = validar;
    }

    public Alumne create() throws InvalidInputException {
        String name = this.getFirstName();
        String surname =this.getSurname();
        String age = this.getAge();
        String dni = this.getDni();
        String zip = this.getZip();
        String email = this.getEmail();

        if(this.siHayErrores()){
            throw new InvalidInputException(this.getErrorList());
        }

        Alumne personas = new Alumne(name, surname,age, dni, zip, email);
        return personas;
    }

Tengo que añadir que tengo otra clase creada llamada validator que con expresiones regulares valida cada tipo de dato insertado. Esta clase se crea como objeto en clase para crear personas y luego despues del metodo create() se va llamando en cada pregunta en los metodos como esto de aqui bajo:

private String getEmail(String email) {
        System.out.println("Cual es su email?");
        email = lector.nextLine();

        if (!validator.mail(email)) {
            setErrorList("El email introducido no es valido");
        }
        return email;

    }

Y tres metodos para guardar los errores producidos.

    private void setErrorList(String errorList) {
    this.errorList.add(errorList);
}

private String [] getErrorList() {
    return this.errorList.toArray(new String[errorList.size()]);
}

private boolean siHayErrores(){

    return !this.errorList.isEmpty();

}

Cuando lanzo mi programa desde mi clase Main:

    public class App {

        public static void main(String[] args) {
        Act18Validator validar = new Act18Validator();
        Scanner scanner = new Scanner(System.in);

        AlumnesFactory persona = new AlumnesFactory(scanner, validar);
        try {
        persona.create();   
        }
        catch(InvalidInputException e) {
            System.out.println("Errores contabilizados: ");
            showErrorList(e.getMessageErrorList());

        }
    }

    public static void showErrorList(String [] e) {
        for (Object fallo: e){
            System.out.println(fallo);
        }
    }
}

Si no hay errores funciona correctamente, pero al detectar algún error me salta

Exception in thread "main" java.lang.NullPointerException

Situado aqui segun se el error lo da 'e' porq esta null pero nose como arreglarlo:

public static void showErrorList(String [] e) {
        for (Object fallo: e){
            System.out.println(fallo);
        }
    }

Lo que tengo que hacer es que cuando se lance una excepción me contabilice el error es decir si hago 3 errores me contabilizara 3 errores y me los enseñará por pantalla al terminar la ronda de preguntas. Me estoy volviendo loca buscando el error, ya que soy nueva con esto de tratar excepciones y no se donde estoy fallando alguien tiene alguna idea?

Si se necesita ampliar el código lo añado sin problema pero iba a ser muy extenso.

Muchísimas gracias de antemano.

  • ¿Esto responde a tu pregunta? [¿Cuál es la solución a todos los errores NullPointerException presentes, pasados y futuros?](https://es.stackoverflow.com/questions/42977/cu%C3%A1l-es-la-soluci%C3%B3n-a-todos-los-errores-nullpointerexception-presentes-pasados) . Presiento que el posible error esta aquí: `this.errorList.add(errorList);`. Fíjate si realmente creaste el objeto para la variable `errorList`. – MrDave1999 Feb 22 '20 at 01:29
  • mm es decir que mis variables null dan este error ? –  Feb 22 '20 at 01:36
  • ¿En que línea de código te lanza la excepción? Posiblemente sea en la línea: `getEmail(email);`... Si la variable `errorList` la declaraste como un atributo, por defecto valdrá `null`, así que al momento de usar algún método, dará dicha excepción, siempre y cuando, no hayas instanciado la clase. – MrDave1999 Feb 22 '20 at 01:40
  • He solucionado algunos posibles errores y me dice que el error ahora lo tengo en esta linea public static void showErrorList(String [] e) { for (Object fallo: e){ System.out.println(fallo); } } –  Feb 22 '20 at 01:59
  • Voy a editar mi pregunta dejado el codigo como esta ahora –  Feb 22 '20 at 02:00
  • Al parecer el parámetro `e` (del método `showErrorList`) está recibiendo un `null` y por esa razón, da la excepción. Necesitas fijarte si en la clase `InvalidInputException` estas instanciando la variable `messageErrorList`. Para que puedas solucionar ese error, necesitas primero entender porque te da el error, de lo contrario, nunca lo podrás solucionar. – MrDave1999 Feb 22 '20 at 02:22
  • si private static String messageErrorList[]; esta es –  Feb 22 '20 at 02:27
  • mmmm es que no entiendo porque me da el error estoy bastante perdida –  Feb 22 '20 at 02:28
  • Edita tu pregunta y añade en que parte invocas el metodo setMessageError de la clase InvalidInput. También date cuenta que el parámetro del constructor de esa clase en ningún momento la usas. Es difícl ayudarte a través de comentarios. Si el error persiste, podemos pasar esta conversión a un chat. – MrDave1999 Feb 22 '20 at 02:38
  • Creo que nunca la invoco, si quieres podemos hablar mejor por chat porque esto creo que sera largo –  Feb 22 '20 at 02:46
  • 1
    Entonces el error esta mas claro que la panela:) En el constructor de la clase InvalidInputException en ningún momento asigna el valor del parámetro (errorList) a la variable messageErrorList. – MrDave1999 Feb 22 '20 at 02:50
  • te vas a reir pero nose como colocar este metodo en mi codigo, es decir que asignarle o como para que funcione, estoy mareadisima –  Feb 22 '20 at 02:55
  • Pudiste solucionarlo? – MrDave1999 Feb 23 '20 at 15:19
  • 1
    [Continuemos el debate en el chat](https://chat.stackexchange.com/rooms/104814/discussion-between-mrdave1999-and-azucarilla). – MrDave1999 Feb 23 '20 at 15:20

1 Answers1

1

Cuando lanzas la excepción InvalidInputException, pasas la lista de errores como parámetro al constructor, pero luego no lo almacenas dentro de la instancia de la propia excepción, si cambias el constructor de la siguiente manera debería funcionar como esperas:

public final class InvalidInputException extends Exception {

    private String messageErrorList[];

    public InvalidInputException(String[] errorList) {
        this.setMessageErrorList(errorList);
    }

    public String[] getMessageErrorList() {
        return messageErrorList;
    }

    public void setMessageErrorList(String[] messageErrorList) {
        this.messageErrorList = messageErrorList;
    }

}

Por otro lado, en las excepciones, lo habitual es pasar todos los parámetros en el constructor y hacer el objeto "inmutable", es decir, en este caso yo haría el atributo final, de esta forma Java te avisa si el atributo no fue inicializado después de llamar al constructor:

public final class InvalidInputException extends Exception {

    private final String messageErrorList[];

    public InvalidInputException(String[] errorList) {
        this.messageErrorList = messageErrorList;
    }

    public String[] getMessageErrorList() {
        return messageErrorList;
    }

}
Roberto
  • 1,239
  • 3
  • 5
  • 1
    Hola Roberto disculpa la tardanza en responderte :) tu solucion fue de mucha ayuda aunque no logre completar la actividad del todo por algun motivo seguia dando error, pero ya he logrado solucionarlo :) muchisimas gracias! –  Feb 24 '20 at 03:11