A continuación se muestra mi código y el método de impresión está en la primera clase (Hyrestagare) como "dirección de cadena pública ()".
Sigo leyendo preguntas y respuestas similares en Stackoverflow. Pero me confundo más. Realizo cambios en el código, reescribo partes, pero simplemente no puedo resolver el problema. :(
En la clase Hyrestagare
, el método address()
llama a getAddress()
en el objeto Hus
, sin embargo, no hay una llamada setAddress()
en la clase Demo
y, por lo tanto, la dirección permanece null
, intente lo siguiente:
Hyrestagare a1 = new Hyrestagare(); a1.setNamn("Donald"); a1.setPersonnummer(111); Hyrestagare a2 = new Hyrestagare(); a2.setNamn("Ivanka"); a2.setPersonnummer(222); Hyrestagare b1 = new Hyrestagare(); b1.setNamn("Barack"); b1.setPersonnummer(333); Hyrestagare b2 = new Hyrestagare(); b2.setNamn("Michelle"); b2.setPersonnummer(444); Lagenhet l1 = new Lagenhet(); l1.setHyra(5000); l1.setNummer(1); l1.setYta(200); Lagenhet l2 = new Lagenhet(); l2.setHyra(2000); l2.setNummer(2); l2.setYta(50); Hus hus1 = new Hus(); hus1.setAddress("Test Address");//sets the address // HYRESTAGARE KOPPLA TILL LAGENHET a1.setLagenhet(l1); a2.setLagenhet(l1); b1.setLagenhet(l2); b2.setLagenhet(l2); // LAGENHET KOPPLA HYRESTAGARE TILL LAGENHET, KOPPLA LISTA TILL LAGENHET ArrayList<Hyrestagare> renters = new ArrayList<Hyrestagare>(); l1.laggTillHyrestagare(a1); l1.laggTillHyrestagare(a2); l2.laggTillHyrestagare(b1); l2.laggTillHyrestagare(b2); l1.setRenter(renters); l2.setRenter(renters); renters.add(a1); renters.add(a2); renters.add(b1); renters.add(b2); // HUS KOPPLA LAGENHET TILL LISTA ArrayList<Lagenhet> flats = new ArrayList<Lagenhet>(); hus1.laggTillLagenhet(l1); hus1.laggTillLagenhet(l2); hus1.setApartments(flats); flats.add(l1); flats.add(l2); // KOPPLA HUS TILL HUS LISTA ArrayList<Hus> buildings = new ArrayList<Hus>(); buildings.add(hus1); // PRINT METODER for (Hyrestagare temp : hus1.printHyrestagare(1)){ System.out.println("Hyrestagare: " + temp.getNamn() + " (" + temp.getPersonnummer() + ")."); } for (Hyrestagare temp : hus1.printHyrestagare(2)){ System.out.println("Hyrestagare: " + temp.getNamn() + " (" + temp.getPersonnummer() + ")."); } System.out.println("Address: " + a1.address());
En primer lugar, no recomendaría devolver null
nunca, solo hace que lidiar con NullPointerExceptions
sea aún más difícil.
con respecto a tu problema:
public String address(){ for (Hus h : houses){ return h.getAddress(); } return null; }
El problema aquí está en su ejemplo anterior, crea una instancia de Hyrestagare
llamada a1
pero nunca agrega ninguna casa a esta clase.
Es por eso que cuando más tarde llama a a1.address()
, su matriz de casas está vacía, por lo que simplemente returns null;
.
A medida que use una ArrayList
of Hus, tendrá varias direcciones. El problema con su enfoque es que solo obtendrá el elemento de la primera dirección, porque devuelve (escapa de las funciones) el valor.
Dependiendo de cuál sea tu objetivo con esta función, podría ofrecerte algunas soluciones:
1) Esto devolvería todas las direcciones como una nueva lista. Si no hay direcciones, obtendrá una lista vacía y no tendrá que lidiar con nulo.
public List<String> getAddresses(List<Hus> list){ return list.stream() .map(Hus::getAddress) .collect(Collectors.toList()); }
Si esta solución es demasiado compleja para usted, esto le da el mismo resultado con un código más simple:
public List<String> getAddresses(List<Hus> list){ List<String> addresses = new ArrayList<>(); for(Hus h: list){ addresses.add(h.getAddress()); } return addresses; }
Pero si solo desea la primera dirección, como en su código (ya sea intencionado o no):
public static String getAddress(List<Hus> list){ if(list.isEmpty()){ return "no address"; } else { return list.get(0).getAddress(); } }