Java - relaciones entre clases

 
Vista:
sin imagen de perfil

relaciones entre clases

Publicado por carmigh (2 intervenciones) el 16/04/2022 15:13:09
Hola!! Necesito relacionar dos clases a traves de un atributo de tipo clase, pero al llamar al método set me salta un error de acceso.
Copio el código de las clases:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class TuMascotaPrivate {
    private String nombreMascota;
    private String animal;
 
    public TuMascotaPrivate(String nombreMascota, String animal) {
        this.nombreMascota = nombreMascota;
        this.animal = animal;
    }
 
    public String getNombreMascota() {
        return nombreMascota;
    }
 
    public void setNombreMascota(String nombreMascota) {
        this.nombreMascota = nombreMascota;
    }
 
    public String getAnimal() {
        return animal;
    }
 
    public void setAnimal(String animal) {
        this.animal = animal;
    }
 
 
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class ClientePrivate {
    private String nombre;
    private TuMascotaPrivate mascota;
    //constructor
    public ClientePrivate(String nombre) {
        this.nombre = nombre;
    }
 
    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public void setMascotaAnimal(String animal){
        this.mascota.setAnimal(animal);
    }
    public String getMascotaAnimal(){
        this.mascota.getAnimal();
    }
 
 
}

1
2
3
4
5
6
7
public class Principal {
 
    public static void main(String[] args) {
       ClientePrivate cliente1=new ClientePrivate("Miguel");
       System.out.println("El cliente: "+cliente1.getNombre()+" Mascota:"+cliente1.mascota.getNombreMascota()+" Especie: "+cliente1.mascota.getAnimal());
    }
}

No me marca error en el código pero me da un error al ejecutarlo:
Exception in thread "main" java.lang.NullPointerException
at ClientePrivate.getMascotaAnimal(ClientePrivate.java:20)
at Principal.main(Principal.java:7)
C:\Users\carmigh\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)


He buscado y probado soluciones y no he encontrado, por eso consulto y desde ya muchisimas gracias por su ayuda!!
Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

relaciones entre clases

Publicado por Kabuto (1381 intervenciones) el 16/04/2022 17:48:41
Creas un cliente llamado "Miguel", pero no le proporcionas una mascota, por eso no puedes mostrar el nombre ni su especie.

"Miguel" necesita una mascota que le alegre la vida.
Pero los métodos que has creado en la clase ClientePrivate para darle una mascota a Miguel, no son válidos, porque has puesto que reciben y retornan un String, (por cierto, te ha faltado una sentencia return en getMascotaAnimal() )

1
2
3
4
5
6
public void setMascotaAnimal(String animal){
        this.mascota.setAnimal(animal);
    }
    public String getMascotaAnimal(){
        this.mascota.getAnimal();
    }

Miguel no quiere sacar a pasear una cadena de caracteres, ¡¡el quiere una auténtica mascota!!
Mejor los cambiamos por estos:
1
2
3
4
5
6
public void setMascota(TuMascotaPrivate mascota){
        this.mascota = mascota;
    }
    public TuMascotaPrivate getMascota(){
        return this.mascota;
    }

Ahora, en el método main(), ya si podemos darle una mascota a Miguel con el método setMascota().
Y usaremos getMascota() para acceder a su nueva mascota y poder obtener su nombre y tipo de animal.

Es necesario usar ese método, no podemos hacerlo accediendo directamente a su atributo con "cliente1.mascota." porque dicho atributo es privado, así que hay que usar su getter y setter, que para eso están.

1
2
3
4
5
public static void main(String[] args) {
       ClientePrivate cliente1=new ClientePrivate("Miguel");
       cliente1.setMascota(new TuMascotaPrivate("Caponata","Gallina"));
       System.out.println("El cliente: "+cliente1.getNombre()+" Mascota:"+cliente1.getMascota().getNombreMascota()+" Especie: "+cliente1.getMascota().getAnimal());
    }

Si queremos cambiar datos de la mascota de Miguel, de nuevo usaremos sus getters y setters para hacer el cambio

1
2
3
4
5
6
7
8
public static void main(String[] args) {
       ClientePrivate cliente1=new ClientePrivate("Miguel");
       cliente1.setMascota(new TuMascotaPrivate("Caponata","Gallina"));
       System.out.println("El cliente: "+cliente1.getNombre()+" Mascota:"+cliente1.getMascota().getNombreMascota()+" Especie: "+cliente1.getMascota().getAnimal());
       //Cambiamos nombre de la mascota
       cliente1.getMascota().setNombreMascota("Luisa");
       System.out.println("La " + cliente1.getMascota.getAnimal() + " de " + cliente1.getNombre() +" ahora se llama " + cliente1.getMascota().getNombreMascota());
    }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

relaciones entre clases

Publicado por carmigh (2 intervenciones) el 17/04/2022 16:23:53
@kabuto sos un genio, no sé con que me enredé tanto, era mucho más simple... Muchísimas gracias! y muy pedagógica tu explicación
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

relaciones entre clases

Publicado por Lizarry (4 intervenciones) el 26/04/2022 16:39:23
Creo que le será muy útil a otros también.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar