Kleine Frage zu OOP

Ich schlage dir vor, als Verständnishilfe, immer den kompletten Code der aktuellen Methode zu posten um im Kontext zu bleiben.

Generell, funktioniert der Code denn wenn du deinen "Dann so" Ansatz folgst? (Zumindest sollte er...)
 
Java:
public class Familie {

	private String name;
	private Haus meldung;
	private Person[] familienmitglieder;

	public Familie(String name, Haus meldung, Person[] familienmitglieder) {
		this.name = name;
		this.meldung = meldung;
		this.familienmitglieder = familienmitglieder;
	}

    public boolean ummelden(Haus meldung) {
        if (meldung.anmelden(this)) {
            if(this.meldung.abmelden(this)){
                return true;
            }
            meldung.abmelden(this);
        }
        return false;
    }

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Haus getMeldung() {
		return meldung;
	}

	public void setMeldung(Haus meldung) {
		this.meldung = meldung;
	}

	public Person[] getFamilienmitglieder() {
		return familienmitglieder;
	}

	public void setFamilienmitglieder(Person[] familienmitglieder) {
		this.familienmitglieder = familienmitglieder;
	}

}

Das ist die ganze Familienklasse
 
Java:
1) testFamilie(PublicTests)
java.lang.AssertionError
	at org.junit.Assert.fail(Assert.java:86)
	at org.junit.Assert.assertTrue(Assert.java:41)
	at org.junit.Assert.assertTrue(Assert.java:52)
	at PublicTests.testFamilie(PublicTests.java:104)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
	at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
	at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
2) testAnAbmelden(PublicTests)
java.lang.AssertionError
	at org.junit.Assert.fail(Assert.java:86)
	at org.junit.Assert.assertTrue(Assert.java:41)
	at org.junit.Assert.assertTrue(Assert.java:52)
	at PublicTests.testAnAbmelden(PublicTests.java:58)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
	at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
	at org.junit.runner.JUnitCore.main(JUnitCore.java:36)

Das sind die 2 error-Meldungen, die er ausspuckt.
 
Java:
Familie.java


Haus.java


Person.java
Gegeben sind die Klassen "Person", "Familie" und "Haus".
Innerhalb der Klassen befindet sich jeweils ein Blockkommentar mit einer Beschreibung.
Implementieren Sie gemäß der Beschreibungen die Klassen aus.

Die Namen innerhalb der Anführungsstriche müssen auch im Code übernommen werden,
ansonsten wird es als Compiler-Fehler gewertet. 
Please adhere to the following schema when naming your solution files: Person.java, Familie.java, Haus.java. 
Test your solution with this unit test:


PublicTests.java
Upload Solution 
Your solution


Familie.java


Haus.java


Person.java


 

PublicTests.java 
import static org.junit.Assert.*;

import org.junit.Test;

public class PublicTests {


	
	public void testPerson() {
		Person p = new Person("Hans");
		assertEquals("Hans", p.getName());
		p.setName("Peter");
		assertEquals("Peter", p.getName());
	}
	
	[USER=5814]@test[/USER]
	public void testHaus() {
		Person p1 = new Person("Hans");
		Haus h = new Haus("Das ist die Adresse", p1, 2);
		Familie[] f = new Familie[2];
		assertEquals("Das ist die Adresse", h.getAdresse());
		assertEquals(2, h.getAnzahlWohneinheiten());
		assertEquals(p1, h.getBesitzer());
		assertArrayEquals(f, h.getBewohner());
		
		Person p2 = new Person("Ute");
		h.setBesitzer(p2);
		h.setAdresse("neue Adresse");
		Familie[] f2 = new Familie[1];
		h.setBewohner(f2);
		h.setAnzahlWohneinheiten(3);
		
		assertEquals("neue Adresse", h.getAdresse());
		assertEquals(3, h.getAnzahlWohneinheiten());
		assertEquals(p2, h.getBesitzer());
		assertArrayEquals(f2, h.getBewohner());
		
	}
	
	[USER=5814]@test[/USER]
	public void testAnAbmelden() {
		Person besitzer = new Person("Hans");
		Haus h1 = new Haus("Adresse", besitzer, 3);
		Familie f = new Familie("Heinzen", h1, new Person[]{besitzer});
		
		Familie[] familien = h1.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			assertNull(familien[i]);
		}
		
		//Anmelden
		h1.anmelden(f);
		boolean contains = false;
		familien = h1.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f) contains = true;
		}
		assertTrue(contains);
		
		//Abmelden
		h1.abmelden(f);
		contains = false;
		familien = h1.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f) contains = true;
		}
		assertFalse(contains);
	}
	
	[USER=5814]@test[/USER]
	public void testFamilie() {
		Person p1 = new Person("N1");
		Person p2 = new Person("N2");
		Person p3 = new Person("N3");
		Person p4 = new Person("N4");
		Person p5 = new Person("N5");
		
		Person besitzer = new Person("Peter");
		Haus h1 = new Haus("Endlosstr. 5, Im Nimmerland", besitzer, 3);
		Person[] familienmitglieder = {p1,p2,p3};
		Familie f1 = new Familie("Heinzen", h1, familienmitglieder);
		h1.anmelden(f1);
		
		//Getter
		assertEquals("Heinzen", f1.getName());
		assertEquals(h1, f1.getMeldung());
		assertArrayEquals(familienmitglieder, f1.getFamilienmitglieder());
		
		//Setter
		f1.setName("Schmitt");
		Person[] familienmitglieder2 = new Person[] {p4,p5};
		f1.setFamilienmitglieder(familienmitglieder2);
		

		//ummelden
		
		Haus h2 = new Haus("Endlosstr. 2, Im Nimmerland", besitzer, 3);
		
		boolean contains = false;
		Familie[] familien = h1.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f1) contains = true;
		}
		assertTrue(contains);
		
		contains = false;
		familien = h2.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f1) contains = true;
		}
		assertFalse(contains);
		
		f1.ummelden(h2);
		
		contains = false;
		familien = h1.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f1) contains = true;
		}
		assertFalse(contains);
		
		contains = false;
		familien = h2.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f1) contains = true;
		}
		assertTrue(contains);
		
		f1.setMeldung(h2);   //Wurde im Idealfall bereits beim Ummelden gesetzt!
		assertEquals(h2,f1.getMeldung());
	}


}
[/i][/i][/i][/i][/i][/i][/i]
 
Zuletzt bearbeitet:
Hausklasse:
Java:
public class Haus {

	private String adresse;
	private int anzahlWohneinheiten;
	private Person besitzer;
	private Familie[] bewohner;

	public Haus(String adresse, Person besitzer,int anzahlWohneinheiten) {
		this.adresse = adresse;
		this.besitzer = besitzer;

		if (anzahlWohneinheiten < 1) {
			Math.ceil(anzahlWohneinheiten);
		}
		bewohner = null;
		this.bewohner = new Familie[anzahlWohneinheiten];
		this.anzahlWohneinheiten = anzahlWohneinheiten;
	}

	public boolean anmelden(Familie someFam) {
		 for (int i = 0; i < bewohner.length-1; ++i) {
	           for (int j = i+1; j < bewohner.length; ++j) {
	             if (bewohner[i] == bewohner[j]) {
	                 return false;
	             	} 
	           }
		 }
		for(int i = 0; i < bewohner.length; i++) {
            if(bewohner[i] == null) {
                bewohner[i] = someFam;
            }
     }
    return true;
	}
	
	public boolean abmelden(Familie someFam) {
		 for(int i = 0; i < bewohner.length; i++) {
		        if(bewohner[i].equals(someFam)) { 
		            bewohner[i] = null;
		            return true;
		        }
		    }
		    return false;
		
	}

	public String getAdresse() {
		return adresse;
	}

	public void setAdresse(String adresse) {
		this.adresse = adresse;
	}

	public int getAnzahlWohneinheiten() {
		return anzahlWohneinheiten;
	}

	public void setAnzahlWohneinheiten(int anzahlWohneinheiten) {
		this.anzahlWohneinheiten = anzahlWohneinheiten;
	}

	public Person getBesitzer() {
		return besitzer;
	}

	public void setBesitzer(Person besitzer) {
		this.besitzer = besitzer;
	}

	public Familie[] getBewohner() {
		return bewohner;
	}

	public void setBewohner(Familie[] bewohner) {
		this.bewohner = bewohner;
	}

}
 
Ja, deine anmelden methode im Haus, scheint nicht wirklich zu funktionieren. Ich habe auch tatsächlich keine Lust mir ~300 Kommentare durchzulesen, um zu sehen was du da versucht hast zu implementieren.

Java:
public boolean anmelden(Familie someFam) {
    for (int i = 0; i < bewohner.length-1; ++i) { // START
        for (int j = i+1; j < bewohner.length; ++j) {
            if (bewohner[i] == bewohner[j]) {
                return false;
            }
        }
    } //ENDE - Was willst du mit diesem Schleifenkonstrukt erreichen?
    for(int i = 0; i < bewohner.length; i++) { // Diese Schleife soll die Familie einfach an einen freien Platz setzen, klingt schlüssig.
        if(bewohner[i] == null) {
            bewohner[i] = someFam;
        }
    }
    return true;
}

Dein "bewohner = null" im Konstruktor hat keinen Effekt, ist dadurch nicht notwendig. Hat aber auch nichts mit dem Fehler zu tun.
 
Code:
* Die public-Methode "anmelden" erhält eine Familie und gibt ein boolean zurück.
     1. Die Familie wird an eine freie Stelle im Array hinzugefügt.
     2. Eine Wohneinheit ist frei, wenn das Element im Array der Bewohner "null" ist.
     3. Ein Familien-Objekt darf nicht mehrfach im Bewohner-Array auftauchen.
     4. Sobald die Familie erfolgreich hinzugefügt wurde, gibt die Methode true zurück,
     5. ansonsten false;

Das passt nicht ganz auf deine aktuelle "anmelden" funktion. Fangen wir mit der Validierung an:
  • Ein Familien-Objekt darf nicht mehrfach im Bewohner-Array auftauchen.

Nun kannst du einmal über alle Wohnung iterieren und prüfen:
- Ist die Wohnung bereits vergeben, prüfe ob der aktuelle bewohner die neue Familie ist (bewohner[i] == someFam)
Falls Ja: return false


Nun suchen wir eine neue Wohnung, gemäß der Aufgabenstellung (Die Familie wird an eine freie Stelle im Array hinzugefügt.):
Java:
for(int i = 0; i < bewohner.length; i++) { // Diese Schleife soll die Familie einfach an einen freien Platz setzen, klingt schlüssig.
    if(bewohner[i] == null) {
        bewohner[i] = someFam;
        return true; // Sobald die Familie erfolgreich hinzugefügt wurde, gibt die Methode true zurück,
    }
}
return false; //Falls keine Wohnung frei war, geben wir false zurück.

Diese Logik nun implementiert, sollte deine neue anmelden() funktion sein.

Achtung: Hier in der Antwort steht nur die Hälfte der Lösung zum Kopieren.
 
Java:
1) testFamilie(PublicTests)
java.lang.AssertionError
	at org.junit.Assert.fail(Assert.java:86)
	at org.junit.Assert.assertTrue(Assert.java:41)
	at org.junit.Assert.assertTrue(Assert.java:52)
	at PublicTests.testFamilie(PublicTests.java:104)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
	at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
	at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
2) testHaus(PublicTests)
java.lang.AssertionError: expected:<2> but was:<0>
	at org.junit.Assert.fail(Assert.java:88)
	at org.junit.Assert.failNotEquals(Assert.java:834)
	at org.junit.Assert.assertEquals(Assert.java:645)
	at org.junit.Assert.assertEquals(Assert.java:631)
	at PublicTests.testHaus(PublicTests.java:22)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
	at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
	at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
3) testAnAbmelden(PublicTests)
java.lang.AssertionError
	at org.junit.Assert.fail(Assert.java:86)
	at org.junit.Assert.assertTrue(Assert.java:41)
	at org.junit.Assert.assertTrue(Assert.java:52)
	at PublicTests.testAnAbmelden(PublicTests.java:58)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
	at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
	at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
Das kann doch nicht wahr sein, jetzt habe ich 3 Fehler !! 🙁(
 
Java:
	public boolean anmelden(Familie someFam) {
		 for (int i = 0; i < bewohner.length-1; ++i) {
	           for (int j = i+1; j < bewohner.length; ++j) {
	             if (bewohner[i] == bewohner[j]) {
	                 return false;
	             	} 
	           }
		 }
		for(int i = 0; i < bewohner.length; i++) {
            if(bewohner[i] == null) {
                bewohner[i] = someFam;
                return true;
            }
     }
    return false;
	}

Meine Anmeldenmethode
 
Kann mir jemand helfen bei der Meldung ist nur noch 1 Fehler?
Java:
	Familie[] f = new Familie[2];
		assertEquals("Das ist die Adresse", h.getAdresse());
		assertEquals(2, h.getAnzahlWohneinheiten());
		assertEquals(p1, h.getBesitzer());
		assertArrayEquals(f, h.getBewohner());
Das ist der Test der mit dem Programm durchgeführt wird
Java:
1) testHaus(PublicTests)
java.lang.AssertionError: expected:<2> but was:<0>
	at org.junit.Assert.fail(Assert.java:88)
	at org.junit.Assert.failNotEquals(Assert.java:834)
	at org.junit.Assert.assertEquals(Assert.java:645)
	at org.junit.Assert.assertEquals(Assert.java:631)
	at PublicTests.testHaus(PublicTests.java:22)

Das ist die Fehlermeldung
 
Java:
    public boolean anmelden(Familie someFam) {
         for (int i = 0; i < bewohner.length-1; ++i) {
               for (int j = i+1; j < bewohner.length; ++j) {
                 if (bewohner[i] == bewohner[j]) {
                     return false;
                     }
               }
         }
        for(int i = 0; i < bewohner.length; i++) {
            if(bewohner[i] == null) {
                bewohner[i] = someFam;
                return true;
            }
     }
    return false;
    }

Meine Anmeldenmethode

Du prüfst, ob ein Bewohner doppelt ist. Das bedeutet, dass Du eine Familie doppelt anmelden kannst. Denn bei der zweiten Anmeldung ist noch nichts doppelt. Ab dem Moment ist dann keine Anmeldung mehr möglich.

Also wie Dir schon mehrfach gesagt wurde: Du brauchst keine doppelte Schleife!

Damit die Familie nicht doppelt eingefügt wird: was machst Du?

Visuelles Problem: Dein Papa will Dir Geld geben, aber du sollst von jedem Geldschein nur genau einen haben. Wie prüfst du, ob Du den 50€ Geldschein einstecken kannst?
 
Java:
    public int getAnzahlWohneinheiten() {
        return anzahlWohneinheiten;
    }
Die Variable wird beim An- und Abmelden nicht verändert.
 
Also Du schaust nach, ob Du schon einen 50er hast. Und wenn nicht, dann nimmst Du ihn an.

Also wie kannst Du schauen, ob eine Familie schon angemeldet ist?
 
Java:
for(i=0;i<bewohner.length;++i){
if(meldung.anmelden(this)=someFam){
return true;
}else{
meldung.anmelden(this)
}
}
}
 
Ja! Ich war gerade dabei etwas längeres zu schreiben, aber ja: Das sieht gut aus!

Wo ich nur unsicher bin: Was ist gefordert? Ein return true oder false? Soll die Anmeldung als erfolgreich gelten oder als fehlgeschlagen? Aber so sieht es gut aus. Zeig jetzt mal die ganze Methode.
 
Java:
public boolean anmelden(Familie someFam) {
		
		for(int i=0;i<bewohner.length;i++) {
			if(bewohner[i]=someFam) {
				return true;
			}
				
		}
		
		
		for (int i = 0; i < bewohner.length; i++) {
			if (bewohner[i] == null) {
				bewohner[i] = someFam;
				return true;
			}
		}
		return false;

	}
 
Ach was: Eine Sache übersehen: Das muss natürlich ein == sein und kein =!
= ist die Zuweisung
== ist der Vergleich

Wir wollen natürlich vergleichen!
 
Java:
 * Die public-Methode "anmelden" erhält eine Familie und gibt ein boolean zurück.
	 * Die Familie wird an eine freie Stelle im Array hinzugefügt.
	 * Eine Wohneinheit ist frei, wenn das Element im Array der Bewohner "null" ist.
	 * Ein Familien-Objekt darf nicht mehrfach im Bewohner-Array auftauchen.
	 * Sobald die Familie erfolgreich hinzugefügt wurde, gibt die Methode true zurück,
	 * ansonsten false;
 
Ist es jetzt korrekt so
Java:
	for(int i=0;i<bewohner.length;i++) {
			if(bewohner[i]==someFam) {
				return true;
			}
				
		}
		
		
		for (int i = 0; i < bewohner.length; i++) {
			if (bewohner[i] == null) {
				bewohner[i] = someFam;
				return true;
			}
		}
		return false;

	}
 
Ok, da wir die Familie nicht hinzu gefügt haben, ist dann ein false richtig. (Ein true wäre aber auch logisch, dann wäre das Ergebnis: "Ist die Familie angemeldet". Aber es soll sein "Ist die Familie (jetzt) hinzugefügt worden".

Daher erst einmal ein return false einsetzen in der ersten if. Und damit den Test noch einmal probieren.
 
Kannst Du mir den Test, der fehlschlägt, genau zeigen mit markierter Zeile, welcher Assert fehlschlägt?
 
Java:
    for(int i=0;i<bewohner.length;i++) {
            if(bewohner[i]==someFam) {
                return false; // Hier müsste nach Aufgabe ein false hin.
            }
               
        }
       
       
        for (int i = 0; i < bewohner.length; i++) {
            if (bewohner[i] == null) {
                bewohner[i] = someFam;
                return true;
            }
        }
        return false;

    }
 
Java:
1) testHaus(PublicTests)
java.lang.AssertionError: expected:<2> but was:<0>
	at org.junit.Assert.fail(Assert.java:88)
	at org.junit.Assert.failNotEquals(Assert.java:834)
	at org.junit.Assert.assertEquals(Assert.java:645)
	at org.junit.Assert.assertEquals(Assert.java:631)
	at PublicTests.testHaus(PublicTests.java:22)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
	at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
	at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
 
Java:
Aufgabe 1 (3 points counting towards “Practice”) 
Es soll ein Teil einer Software für ein Meldeamt erstellt werden.


Familie.java


Haus.java


Person.java
Gegeben sind die Klassen "Person", "Familie" und "Haus".
Innerhalb der Klassen befindet sich jeweils ein Blockkommentar mit einer Beschreibung.
Implementieren Sie gemäß der Beschreibungen die Klassen aus.

Die Namen innerhalb der Anführungsstriche müssen auch im Code übernommen werden,
ansonsten wird es als Compiler-Fehler gewertet. 
Please adhere to the following schema when naming your solution files: Person.java, Familie.java, Haus.java. 
Test your solution with this unit test:


PublicTests.java
Upload Solution 
Your solution


Familie.java


Haus.java


Person.java

PublicTests.java: Test failed ✘ 
JUnit version 4.12
..E..
Time: 0.005
There was 1 failure:
1) testHaus(PublicTests)
java.lang.AssertionError: expected:<2> but was:<0>
	at org.junit.Assert.fail(Assert.java:88)
	at org.junit.Assert.failNotEquals(Assert.java:834)
	at org.junit.Assert.assertEquals(Assert.java:645)
	at org.junit.Assert.assertEquals(Assert.java:631)
	at PublicTests.testHaus(PublicTests.java:22)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
	at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
	at org.junit.runner.JUnitCore.main(JUnitCore.java:36)

FAILURES!!!
Tests run: 4,  Failures: 1
Correction
Correction pending… 
Assignment 5
(Deadline: 12/04/2019, 8:00:00 AM) 

Aufgabe 1 (3 points counting towards “Practice”) 
Assignment 4
(Deadline: 11/27/2019, 8:00:00 AM) 

Aufgabe 1 (3 points counting towards “Practice”) 
Assignment 3
(Deadline: 11/20/2019, 8:00:00 AM) 

Aufgabe 1 (3 points counting towards “Practice”) 
Assignment 2
(Deadline: 11/13/2019, 8:00:00 AM) 

Aufgabe 1 (3 points counting towards “Practice”) 
Assignment 1
(Deadline: 11/06/2019, 8:00:00 AM) 

Aufgabe 1 (3 points counting towards “Practice”) 
About the Autocorrector
Feedback
 
×
PublicTests.java 
import static org.junit.Assert.*;

import org.junit.Test;

public class PublicTests {


	@Test
	public void testPerson() {
		Person p = new Person("Hans");
		assertEquals("Hans", p.getName());
		p.setName("Peter");
		assertEquals("Peter", p.getName());
	}
	
	@Test
	public void testHaus() {
		Person p1 = new Person("Hans");
		Haus h = new Haus("Das ist die Adresse", p1, 2);
		Familie[] f = new Familie[2];
		assertEquals("Das ist die Adresse", h.getAdresse());
		assertEquals(2, h.getAnzahlWohneinheiten());
		assertEquals(p1, h.getBesitzer());
		assertArrayEquals(f, h.getBewohner());
		
		Person p2 = new Person("Ute");
		h.setBesitzer(p2);
		h.setAdresse("neue Adresse");
		Familie[] f2 = new Familie[1];
		h.setBewohner(f2);
		h.setAnzahlWohneinheiten(3);
		
		assertEquals("neue Adresse", h.getAdresse());
		assertEquals(3, h.getAnzahlWohneinheiten());
		assertEquals(p2, h.getBesitzer());
		assertArrayEquals(f2, h.getBewohner());
		
	}
	
	@Test
	public void testAnAbmelden() {
		Person besitzer = new Person("Hans");
		Haus h1 = new Haus("Adresse", besitzer, 3);
		Familie f = new Familie("Heinzen", h1, new Person[]{besitzer});
		
		Familie[] familien = h1.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			assertNull(familien[i]);
		}
		
		//Anmelden
		h1.anmelden(f);
		boolean contains = false;
		familien = h1.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f) contains = true;
		}
		assertTrue(contains);
		
		//Abmelden
		h1.abmelden(f);
		contains = false;
		familien = h1.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f) contains = true;
		}
		assertFalse(contains);
	}
	
	@Test
	public void testFamilie() {
		Person p1 = new Person("N1");
		Person p2 = new Person("N2");
		Person p3 = new Person("N3");
		Person p4 = new Person("N4");
		Person p5 = new Person("N5");
		
		Person besitzer = new Person("Peter");
		Haus h1 = new Haus("Endlosstr. 5, Im Nimmerland", besitzer, 3);
		Person[] familienmitglieder = {p1,p2,p3};
		Familie f1 = new Familie("Heinzen", h1, familienmitglieder);
		h1.anmelden(f1);
		
		//Getter
		assertEquals("Heinzen", f1.getName());
		assertEquals(h1, f1.getMeldung());
		assertArrayEquals(familienmitglieder, f1.getFamilienmitglieder());
		
		//Setter
		f1.setName("Schmitt");
		Person[] familienmitglieder2 = new Person[] {p4,p5};
		f1.setFamilienmitglieder(familienmitglieder2);
		

		//ummelden
		
		Haus h2 = new Haus("Endlosstr. 2, Im Nimmerland", besitzer, 3);
		
		boolean contains = false;
		Familie[] familien = h1.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f1) contains = true;
		}
		assertTrue(contains);
		
		contains = false;
		familien = h2.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f1) contains = true;
		}
		assertFalse(contains);
		
		f1.ummelden(h2);
		
		contains = false;
		familien = h1.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f1) contains = true;
		}
		assertFalse(contains);
		
		contains = false;
		familien = h2.getBewohner();
		for (int i = 0; i < familien.length; i++) {
			if(familien[i] == f1) contains = true;
		}
		assertTrue(contains);
		
		f1.setMeldung(h2);   //Wurde im Idealfall bereits beim Ummelden gesetzt!
		assertEquals(h2,f1.getMeldung());
	}


}
 

Neue Themen


Zurück
Oben