0

Veréis, estoy haciendo un programa simple para practicar herencias, interfaces, enumerados, listas, etc. Ya que estoy empezando de cero con Java y con la programación en general, entonces ando un poco perdido y no se que he hecho mal. Tengo la clase padre "Personajes" que tiene una hija que es "Heroes", la clase padre tiene tres listas: una para los nombres, otra para los colores de los trajes y otra para los poderes, el problema viene cuando creo un objeto en la clase main, dandole valores a null a los tres atributos de lista para añadirle los elementos en las siguientes lineas, pues me marca todo bien, pero cuando ejecuto: PUM, Null Pointer, y no se porque... os dejo el código, aunque creo que lo he hecho como siempre:

Esta es la clase padre:

package modelos;

import java.util.ArrayList;
import java.util.List;

import enums.ColorTraje;
import enums.EnumVengadores;
import enums.SuperPoder;

public class Personaje {

private List<EnumVengadores> nombreLst;
private List<SuperPoder> superPoderLst;
private Integer edad;
private Boolean isMalvado;
private Float estatura;
private List<ColorTraje> colorTrajeLst;

public Personaje() {

    superPoderLst = new ArrayList<SuperPoder>();
    nombreLst = new ArrayList<EnumVengadores>();
    colorTrajeLst = new ArrayList<ColorTraje>();

}

public Personaje(List<EnumVengadores> nombreLst, List<SuperPoder> superPoderLst, Integer edad, Boolean isMalvado,
        Float estatura, List<ColorTraje> colorTrajeLst) {

    this.edad = edad;
    this.isMalvado = isMalvado;
    this.estatura = estatura;

    if (nombreLst != null) {

        this.nombreLst = nombreLst;

    }

    else {

        nombreLst = new ArrayList<EnumVengadores>();

    }

    if (superPoderLst != null) {

        this.superPoderLst = superPoderLst;

    }

    else {

        superPoderLst = new ArrayList<SuperPoder>();

    }

    if (colorTrajeLst != null) {

        this.colorTrajeLst = colorTrajeLst;

    }

    else {

        colorTrajeLst = new ArrayList<ColorTraje>();

    }

}

public List<EnumVengadores> getNombreLst() {

    return nombreLst;

}

public void setNombreLst(List<EnumVengadores> nombreLst) {

    this.nombreLst = nombreLst;

}

public List<SuperPoder> getSuperPoderLst() {

    return superPoderLst;

}

public void setSuperPoderLst(List<SuperPoder> superPoderLst) {

    this.superPoderLst = superPoderLst;

}

public Integer getEdad() {

    return edad;

}

public void setEdad(Integer edad) {

    this.edad = edad;

}

public Boolean getIsMalvado() {

    return isMalvado;

}

public void setIsMalvado(Boolean isMalvado) {

    this.isMalvado = isMalvado;

}

public Float getEstatura() {

    return estatura;

}

public void setEstatura(Float estatura) {

    this.estatura = estatura;

}

public List<ColorTraje> getColorTrajeLst() {

    return colorTrajeLst;

}

public void setColorTrajeLst(List<ColorTraje> colorTrajeLst) {

    this.colorTrajeLst = colorTrajeLst;

}

Esta es una clase hijo:

package modelos;

import java.util.List;

import enums.ColorTraje;
import enums.EnumVengadores;
import enums.SuperPoder;

public class Heroe extends Personaje {
private Boolean isAvenger;

public Heroe() {

    super();

}

public Heroe(List<EnumVengadores> nombreLst, List<SuperPoder> superPoderLst, Integer edad, Boolean isMalvado,
        Float estatura, List<ColorTraje> colorTrajeLst, Boolean isAvenger) {

    super(nombreLst, superPoderLst, edad, isMalvado, estatura, colorTrajeLst);
    this.isAvenger = isAvenger;

}

public Boolean getIsAvenger() {

    return isAvenger;

}

public void setIsAvenger(Boolean isAvenger) {

    this.isAvenger = isAvenger;

}

Y este es mi main:

package modelos;

import enums.ColorTraje;
import enums.EnumVengadores;
import enums.SuperPoder;

public class mainVengadores {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    /*Personaje ironman = new Heroe();
    ironman.setEdad(48);
    ironman.getNombreLst().add(EnumVengadores.IRONMAN);
    ironman.getColorTrajeLst().add(ColorTraje.AMARILLO);

    System.out.println(ironman);*/


    Personaje hulk=new Personaje(null, null, 45, true, 1.23f, null);

    hulk.getNombreLst().add(EnumVengadores.HULK);
    hulk.getColorTrajeLst().add(ColorTraje.VERDE);
    hulk.getColorTrajeLst().add(ColorTraje.AZUL);
    hulk.getColorTrajeLst().add(ColorTraje.AMARILLO);
    hulk.getSuperPoderLst().add(SuperPoder.Super_Fuerza);

    System.out.println(hulk);

    }
}

Cuando ejecuto la clase main, me da como resultado un Null Pointer, ¿alguna ayuda? Mil gracias :)

Ludiras
  • 774
  • 5
  • 17

1 Answers1

0

Visto tu problema, parece que se te ha olvidado colocar el this en las variables del constructor cuando uno de los argumentos es nulo.

public Personaje(List<EnumVengadores> nombreLst, List<SuperPoder> superPoderLst, Integer edad, Boolean isMalvado,
        Float estatura, List<ColorTraje> colorTrajeLst) {

    this.edad = edad;
    this.isMalvado = isMalvado;
    this.estatura = estatura;

    if (nombreLst != null) {

        this.nombreLst = nombreLst;

    }

    else {

        nombreLst = new ArrayList<EnumVengadores>();

    }

    if (superPoderLst != null) {

        this.superPoderLst = superPoderLst;

    }

    else {

        superPoderLst = new ArrayList<SuperPoder>();

    }

    if (colorTrajeLst != null) {

        this.colorTrajeLst = colorTrajeLst;

    }

    else {

        colorTrajeLst = new ArrayList<ColorTraje>();

    }

}

a

public Personaje(List<EnumVengadores> nombreLst, List<SuperPoder> superPoderLst, Integer edad, Boolean isMalvado,
        Float estatura, List<ColorTraje> colorTrajeLst) {

    this.edad = edad;
    this.isMalvado = isMalvado;
    this.estatura = estatura;

    if (nombreLst != null) {

        this.nombreLst = nombreLst;

    }

    else {

        this.nombreLst = new ArrayList<EnumVengadores>();

    }

    if (superPoderLst != null) {

        this.superPoderLst = superPoderLst;

    }

    else {

        this.superPoderLst = new ArrayList<SuperPoder>();

    }

    if (colorTrajeLst != null) {

        this.colorTrajeLst = colorTrajeLst;

    }

    else {

        this.colorTrajeLst = new ArrayList<ColorTraje>();

    }

}

ya que sin el this tomaría las variables de los argumentos del constructor y no hacía de la propia clase, por lo tanto esas variables de la clase quedarían nulas, solo se usa el this cuando las variables son del mismo nombre y no se pueda referenciar de la propia clase

PoKu
  • 156
  • 3
  • 6
  • Era eso, me he estado peleando casi una hora por una instrucción, anda que... jajajaja muchas gracias :) – Ludiras Apr 27 '19 at 17:49