# Kleine Frage zu OOP



## jono (5. Dez 2019)

```
public class Familie {

    /*
     * Die "Familie" hat folgende private-Eigenschaften
     *  - "name" vom Typ String
     *  - "meldung" vom Typ Haus
     *  - "familienmitglieder" vom Typ Person-Array
```

Meine Frage: Weiß einer, wie das gemeint ist mir vom Typ Haus ?
Verstehe das nicht , steht so in der Aufgabenstellung.


----------



## jono (5. Dez 2019)

*mit


----------



## I3LacKFuSIoN (5. Dez 2019)

Anhand von dem was ich sehe kann ich dir nicht helfen, allerdings könnte sich das ändern, wenn du uns mehr Material zeigst wie u.a. die Aufgabenstellung.


----------



## jono (5. Dez 2019)

```
public class Familie {

    /*
     * Die "Familie" hat folgende private-Eigenschaften
     *  - "name" vom Typ String
     *  - "meldung" vom Typ Haus
     *  - "familienmitglieder" vom Typ Person-Array
     *
     * Erstellen Sie Standard Getter und Setter für alle Eigenschaften.
     * (Bitte automatisch generieren lassen!)
     *
     * Implementieren Sie einen Konstruktor mit name, meldung und familienmitglieder als Parameter.
     * Die Parameter-Werte vom Konstruktor sollen bei den Klasseneigenschaften übernommen werden.
     *
     * Implementieren Sie eine public-Methode "ummelden",
     * der die Familie vom alten Haus abmeldet und in ein neues Haus anmeldet.
     * Die public-Methode "ummelden" erhält ein Haus und gibt ein boolean zurück.
     * Die Methode liefert nur dann true, wenn das Anmelden und Abmelden funktioniert hat und
     * die Meldung aktualisiert wurde.
     * Wenn zum Beispiel die Anmeldung funktioniert aber die Abmeldung nicht, dann muss die Anmeldung
     * wieder rückgängig gemacht werden, bevor false zurückgegeben wird.
     *
     * Zum An- und Abmelden kann die Methode aus Haus verwendet werden
     * z.B. meldung.abmelden(this); würde dieses Objekt von dem gemeldeten Haus abmelden.
     *
     */
    
}
```


----------



## jono (5. Dez 2019)

Die Klasse Familie soll halt mit den Beschreibungen implementiert werden.


----------



## I3LacKFuSIoN (5. Dez 2019)

Ich gehe davon aus, dass in der Aufgabe angenommen wird, dass es eine andere Klasse (Haus) gibt, welche Objekte vom Typ Haus generiert, welche in den Attributen von Familie halt zugewiesen werden können.


----------



## jono (5. Dez 2019)

```
public class Haus {

    /*
     *
     * Das "Haus" hat folgende private-Eigenschaften:
     *
     * - "adresse" vom Typ String
     * - "besitzer" vom Typ Person
     * - "anzahlWohneinheiten" vom Typ int
     * - "bewohner" vom Typ Familie-Array
     *
     * Erstellen Sie Standard Getter und Setter für alle Eigenschaften.
     * (Bitte automatisch generieren lassen!)
     *
     * Implementieren Sie einen Konstruktor mit adresse, besitzer und anzahlWohneinheit als Parameter.
     * Die Adresse und der Besitzer sollen übernommen werden.
     * Wenn die Anzahl der Wohneinheiten kleiner als 1 sein sollte, dann soll 1 dafür verwendet werden.
     * Die Anzahl der Wohneinheiten definiert die Länge des Arrays der Bewohner.
     * Zu Beginn wohnen keine Bewohner und die Elemente des Arrays sind alle "null".
     *
     * Implementieren Sie die Methode "anmelden" bzw. "abmelden",
     * die ein Familien-Objekt als bewohner hinzufügt bzw. entfernt.
     *
     * 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;
     *
     * Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.
     * Falls das Familien-Objekt im Bewohner-Array vorhanden ist,
     * wird deren Wohneinheit als frei markiert und true zurückgegeben,
     * ansonsten wird false zurückgegeben
     *
     */
    
}

[Code=Java]
public class Person {
    
    /*
     * Die "Person" hat die private-Eigenschaft "name" vom Typ String,
     * die dazugehörigen Getter und Setter (Bitte automatisch generieren lassen!)
     * und einen Konstruktor mit dem Namen als Parameter.
     *
     */
    
}
```

Ja, habe zu wenig angegeben stimmt  Muss ja schon alles dargestellt sein, da es ja direkt miteinander zusammenhängt.


----------



## jono (5. Dez 2019)

Wie übergebe ich denn jetzt "meldung" vom Typ Haus an die Klasse Familie ?


----------



## jono (5. Dez 2019)

Bzw. wie übergebe ich "familienmitglieder" vom Typ Person array an die Klasse Familie


----------



## jono (5. Dez 2019)

Also am Anfang steht ja immer private mir ist auch klar wenn es vom Typ String oder int z.B. ist, wie ich das dann anzugeben habe, aber nicht wie ich es zu machen habe, wenn ich die private-Eigenschaften einer bestimmten Klasse durch ein Attribut in einer anderen Klasse wiederzugeben.


----------



## JimWiesel (5. Dez 2019)

wenn du eine Familie erzeugst

Familie familie = new Familie()
dann hast du ein Object vom Typ Familie ("in" der Variable familie)

für den Typ Haus, musst du eine Klasse Haus haben


```
public class Haus {

}
```

Object erzeugen
Haus haus = new Haus()

und haus übergibst du dann genau so wie du auch einen String übergibst

und beim private nutzt du dann logischerweise getter und setter (wie du es auch beim String machst)
nutzt da dann aber anstatt String die Klasse Haus


----------



## jono (5. Dez 2019)

Okay, habe dann in der Klasse Haus "Haus haus = new Haus()"  erzeugt, richtig?
Und dann in der Klasse Familie "private Haus meldung" oder nicht?
Denn das funktioniert nicht, wenn ich es so mache, kann auch gut sein, dass ich etwas falsch verstanden habe. Aber so würde ich es machen, wenn ich dem folge was du geschrieben hast .


----------



## JimWiesel (5. Dez 2019)

zum einen hilft die Aussage "das funktioniert nicht" nicht weiter, WAS funktioniert nicht, was passiert oder was nicht
zum anderen, wenn du das nachfolgende nicht verstehst muss ich dich an einsteiger Literatur verweisen. 
dir dafür den fertigen Code schreiben, wird dir null helfen


```
public class MainClass {
    public static void main(String[] args){
   
    Haus haus = new Haus();   
    Familie familie = new Familie();
    familie.setMeldung(haus);
    }
}

public class Familie {
// hier getter und setter generieren
}

public class Haus {
// hier getter und setter generieren
}

public class Person {
// hier getter und setter generieren
}
```


----------



## jono (5. Dez 2019)

Okay, danke, so habe ich das auch gelernt, habe es eben aber falsch verstanden. 
Wie generiere ich denn jetzt das Person-Array "familienmitglieder" , also wahrscheinlich das Objekt in der Main erzeugen und dann?


----------



## jono (5. Dez 2019)

Schon gut, es scheint so als hätte ich es gerade erzeugt, ich probiere mich jetzt erstmal weiterhin an der Aufgabe, bei wirklichen Problemen, schreibe ich dann wieder in den Thread im weiteren Verlauf des Tages.


----------



## JimWiesel (5. Dez 2019)

ob die Main der richtige Ort dafür ist kommt auf das an was du da baust, war zur schnellen veranschaulichung aber gut genug weil du geschrieben hast in der Klasse Haus ein Objekt vom Typ Haus erzeugen zu wollen (das wirkte etwas wirr)

Person Array
erzeugst du halt genau so wie ein Objekt vom typ Haus oder Familie oder String, halt vom Typ Array und stopfst da Personen Objekte rein 









						Java Arrays
					

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.




					www.w3schools.com


----------



## jono (5. Dez 2019)

```
public class Program {

    public static void main(String[] args) {
        Haus meldung = new Haus();
        Familie familie = new Familie();
        Person person = new Person();

    }

}


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 void ummelden(meldung) {
        meldung.anmelden(this);
    }

    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;
    }

}


public class Haus {

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

    public Haus(String adresse, int anzahlWohneinheiten, Person besitzer, Familie[] bewohner) {
        this.adresse = adresse;
        this.anzahlWohneinheiten = anzahlWohneinheiten;
        this.besitzer = besitzer;
        this.bewohner = bewohner;
    }

    public void anmelden() {
      
    }

    public void abmelden() {

    }


    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;
    }

}


public class Person {

    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

}
```


----------



## jono (5. Dez 2019)

Das sind jetzt erstmal die Standardsachen, die die Aufgabe verlangt. 
Jetzt bin ich bei Aufgabenstellung Familie hängengeblieben.

```
public class Familie {

    /*
     * Die "Familie" hat folgende private-Eigenschaften
     *  - "name" vom Typ String
     *  - "meldung" vom Typ Haus
     *  - "familienmitglieder" vom Typ Person-Array
     *
     * Erstellen Sie Standard Getter und Setter für alle Eigenschaften.
     * (Bitte automatisch generieren lassen!)
     *
     * Implementieren Sie einen Konstruktor mit name, meldung und familienmitglieder als Parameter.
     * Die Parameter-Werte vom Konstruktor sollen bei den Klasseneigenschaften übernommen werden.
     *
     * Implementieren Sie eine public-Methode "ummelden",
     * der die Familie vom alten Haus abmeldet und in ein neues Haus anmeldet.
     * Die public-Methode "ummelden" erhält ein Haus und gibt ein boolean zurück.
     * Die Methode liefert nur dann true, wenn das Anmelden und Abmelden funktioniert hat und
     * die Meldung aktualisiert wurde.
     * Wenn zum Beispiel die Anmeldung funktioniert aber die Abmeldung nicht, dann muss die Anmeldung
     * wieder rückgängig gemacht werden, bevor false zurückgegeben wird.
     *
     * Zum An- und Abmelden kann die Methode aus Haus verwendet werden
     * z.B. meldung.abmelden(this); würde dieses Objekt von dem gemeldeten Haus abmelden.
     *
     */
   
}
```

1.Es heißt ja, dass  Parameter-Werte vom Konstruktor  bei den Klasseneigenschaften übernommen werden sollen, was ist damit genau gemeint, ist mir als Anfänger eine unverständliche Beschreibung.
2.Die public Methode "ummelden" bekommt soll ein Haus erhalten, ich habe deshalb "meldung" in der public methode ummelden eingegeben, aber dann steht dort die Fehlermeldung: Syntax error, insert "... VariableDeclaratorId" to complete FormalParameterList.


----------



## JimWiesel (5. Dez 2019)

zu1)

```
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;
    }
```

deine Eigenschaften sind name, meldung und familienmitglieder
in deinem Konstruktor übergibst du entsprechende "Werte" damit für ein neues Objekt vom entsprechenden Typ die "Werte" von Beginn an gesetzt sind 

Wenn du z.B. ein Auto bauen würdest, dann würde 

Auto auto = new Auto()
eher keinen Sinn machen, weil du nicht erst entscheidest wenn das Auto fertig ist, was es für ein Auto ist, also 


```
Auto auto = new Auto("Golf")
```

die Farbe des Autos lässt sich aber auch machen wenn das Auto (dein Golf) schon fertig ist 


```
Auto auto = new Auto("Golf")
auto.setFarbe("grün")
```

zu2) 
was machst du bei deinen Settern set...() anders als bei deiner Methode ummelden? 

Vielleicht solltest du dir als Anfänger mal ein Buch nehmen und die Grundlagen lesen und dir nicht einfach was zusammen "klicken"


----------



## jono (5. Dez 2019)

Okay, unnötiger Fehler, danke. 
Bei der Aufgabenstellung der Klasse Familie, steht ja jetzt ich soll abmelden und ummelden? dazu hab ich mir erstmal gedacht, dass das die Klasse Haus mit einbezogen werden muss, das alte Haus soll abgemeldet werden und das neue soll angemeldet werden. Jetzt stellt sich mir die Frage wie das gemacht, mir fällt da wirklich keine Funktion ein das zu machen.


----------



## jono (5. Dez 2019)

abmelden und anmelden *


----------



## JimWiesel (5. Dez 2019)

Dann musst du etwas überlegen und Rumprobieren 
Und/Oder Grundlagen aneignen
Die fehlen dir eindeutig


----------



## jono (5. Dez 2019)

Woran würdest du das festmachen das die mir eindeutig fehlen ?


----------



## jono (5. Dez 2019)

Oder was genau definierst du als Grundlage


----------



## JimWiesel (5. Dez 2019)

Zum Beispiel daran das du diese wirklich einfache Aufgabe nicht alleine gelöst bekommst

oder daran das du nicht weißt wie man einen Parameter in einer Methode angibt 
Mit dem Fehler der dir von der IDE angezeigt wird nichts anfangen kannst 
Oder auch nicht nach diesem Fehler googeln kannst 

lies die ersten Kapitel eines Java Anfänger Buches und die Aufgabe ist schnell gelöst


----------



## jono (5. Dez 2019)

Kannst du mir da eventuell eins empfehlen?


----------



## JimWiesel (5. Dez 2019)

Du zeigst ja gar keine Eigeninitiative 
es gibt dazu hier im Forum extra einen Bereich im Forum dafür


----------



## kneitzel (5. Dez 2019)

Schau mal in diesen Thread:
https://www.java-forum.org/thema/buch-fuer-anfaenger-gesucht-java-javafx.186108/

Ich denke, die beiden Empfehlungen, die da Zuspruch bekommen haben, sind:
Schrödinger programmiert Java
und
Java von Kopf bis Fuß

Wobei letzteres etwas älter ist - aber für Anfänger immer noch sehr gut geeignet.

Wenn es nichts kosten soll: Java ist auch eine Insel - Das ist aber nicht ganz so gut für Anfänger geeignet, aber besser als nichts.


----------



## jono (5. Dez 2019)

Okay, habe mir gerade mal den Schrödinger bestellt.
Eine Bitte habe ich, unzwar wollte ich fragen, ob du mir einen Ansatz geben kannst, wie ich das An-und Abmelden angehen kann? Dafür wäre ich dir sehr dankbar, und hoffe, dass du dafür ein bisschen Verständnis hast.


----------



## kneitzel (5. Dez 2019)

Überlege Dir doch erst einmal in Worten, was das abmelden und woanders anmelden bedeutet.

Hast du die Beschreibung der Klassen soweit verstanden um zu wissen, was welche Klasse enthält? Das ist der erste, wichtige Schritt. Dann halt in Ruhe überlegen (Stift und Papier!), was für Situationen es geben kann. Dann überlegen, was sich da dann bei dem ab- und anmelden ändert, sprich: wie soll es danach aussehen?
Wenn du das hast, dann halt wie gefordert: in Worten erläutern, was geändert werden muss.


----------



## jono (6. Dez 2019)

```
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;
		}
```
1. Noch eine Frage zu "private Haus meldung", Wenn ich das Objekt Familie in der main erzeuge, dann kann ich ja Werte wegen dem Konstruktor eingeben, was kann man dann für "Haus meldung" eintragen, da dies ja vom Typ Haus ist ?
2. Beim Anmelden erhöht sich die anzahlWohneinheiten um eine Einheit, und es wird eine neue Adresse hinzugefügt,
beim Abmelden vermindert sich anzahlWohneinheiten um eine Einheit und die Adresse wird erstmal auf  null gesetzt, weil es ja sein kann, dass diese Familie sich wieder woanders anmeldet oder eben auch nicht.


----------



## jono (6. Dez 2019)

Zu 1 nochmal, also ich will wissen was ich in der main bei der objekterzeugung in den Klammern nach dem new…() statt Haus meldung eingeben kann, das ist ja sozusagen nur der Platzhalter.


----------



## jono (6. Dez 2019)

In der Familienklasse wird sich dann auch " Haus meldung" ändern


----------



## jono (6. Dez 2019)

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;

Das beschreibt es ja genau


----------



## mihe7 (6. Dez 2019)

jono hat gesagt.:


> Das beschreibt es ja genau


Wie findest Du z. B. die freie Stelle im Array?


----------



## jono (7. Dez 2019)

```
int pos = Arrays.asList(bewohner).lastIndexOf(null);
```


----------



## jono (7. Dez 2019)

So?


----------



## jono (7. Dez 2019)

```
Eine Wohneinheit ist frei, wenn das Element im Array der Bewohner "null" ist.
Ein Familien-Objekt darf nicht mehrfach im Bewohner-Array auftauchen.
```

Das würde ich mit einer If-Abfrage angehen.


----------



## jono (7. Dez 2019)

```
* Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.
	 * Falls das Familien-Objekt im Bewohner-Array vorhanden ist, 
	 * wird deren Wohneinheit als frei markiert und true zurückgegeben,
	 * ansonsten wird false zurückgegeben
```

Das verwirrt mich etwas, denn hier wird geschrieben " falls das Familien-Objekt" im Bewohner-Array vorhanden ist.
Das Familien-Objekt wäre dann doch sowas wie -> Familie familie = new Familie();
Aber wie ich das Bewohner Array und das Objekt zusammenbringen kann, ist mir absolut nicht klar, auch wenn wir Folien zu OOPM bekommen haben, wird sowas dort nicht behandelt.


----------



## temi (7. Dez 2019)

```
class Foo {
    private int[] intData;
    
    public Foo(int[] data) {
        this.intData = data;
    }
    
    public boolean remove(int someInt) {
        // wenn someInt in intData enthalten ist, dann entferne es daraus und gib true zurück
        // ansonsten gib false zurück
    }
        
}
```

Du hast ein Array von einem bestimmten Typen und sollst in der Methode herausfinden, ob ein bestimmtes Element darin enthalten ist. In deinem Fall handelt es sich halt nicht um "int" (wie in meinem Beispiel) sondern um "Familie". Wie das als Parameter übergebene Objekt erzeugt wird ist, für die Methode selbst nicht relevant.


----------



## jono (7. Dez 2019)

```
public boolean anmelden(Familie[] bewohner) {
		int pos = Arrays.asList(bewohner).lastIndexOf(null);

		if (bewohner == null) {
			return true;
		} else {
			return false;

		}
	}
```

Ich habe es so gemacht, glaube aber, dass dort auf jeden Fall ein Fehler drin ist. 
Aber laut Aufgabenstellung soll es ja so sein, dass eine Wohneinheit frei ist, wenn das Element im Array der Bewohner "null" ist.
Und ->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;


----------



## jono (7. Dez 2019)

Sorry , mache das jetzt für die Methode "abmelden", habe versehentlich abmelden und anmelden verwechselt.


----------



## temi (7. Dez 2019)

jono hat gesagt.:


> ```
> public boolean anmelden(Familie[] bewohner) {
> int pos = Arrays.asList(bewohner).lastIndexOf(null);
> 
> ...



Ich rate mal, dass du nicht ein Array von Familie sondern nur eine einzige Familie als Parameter übergeben sollst. Also anstatt `Familie[] bewohner` nur `Familie bewohner`


----------



## temi (7. Dez 2019)

jono hat gesagt.:


> Ich habe es so gemacht, glaube aber, dass dort auf jeden Fall ein Fehler drin ist.



Wenn du damit meinst, dass ziemlich alles nicht richtig ist, ja.


----------



## jono (7. Dez 2019)

public boolean abmelden(Familie[] someFam) {
	if(someFam==bewohner) {
		someFam = null;
		return true;
	}else {
		return false;
	}

	}


----------



## jono (7. Dez 2019)

```
public boolean abmelden(Familie[] someFam) {
	if(someFam==bewohner) {
		someFam = null;
		return true;
	}else {
		return false;
	}
		
	}
```
Das habe ich dazu?


----------



## jono (7. Dez 2019)

In dem Fall hier wäre es dann

```
publi boolean abmelden(Familie someFam) {
```


----------



## jono (7. Dez 2019)

Dann wäre es bei der abmelden Methode auch Familie someFam laut deinem letzten Beitrag auf Seite 2


----------



## jono (7. Dez 2019)

*anmelden


----------



## jono (7. Dez 2019)

```
* 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;
```
Ist Punkt 1. mit -> int pos = Arrays.asList(bewohner).lastIndexOf(null); korrekt?
Punkt 2. müsste auch richtig sein, da abgefragt wird, ob …[] Bewohner == null ist, wenn ja ist es frei(=true?)


----------



## mihe7 (7. Dez 2019)

jono hat gesagt.:


> Ist Punkt 1. mit -> int pos = Arrays.asList(bewohner).lastIndexOf(null); korrekt?


Kommt darauf an, was bewohner ist. In dem Code


jono hat gesagt.:


> ```
> public boolean anmelden(Familie[] bewohner) {
> int pos = Arrays.asList(bewohner).lastIndexOf(null);
> ```


ist es auf jeden Fall falsch. 

Abgesehen davon kann ich mir nicht vorstellen, dass Du plötzlich Methoden verwenden darfst, die auf Listen operieren, wenn Arrays verlangt sind - aber das musst Du wissen bzw. in Erfahrung bringen.


----------



## jono (7. Dez 2019)

```
private Familie[] bewohner;


	public boolean abmelden(Familie[] someFam) {
	if(someFam==bewohner) {
		someFam = null;
		return true;
	}else {
		return false;
	}
		
	}
Aufgabenstellung:
Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.
	 * Falls das Familien-Objekt im Bewohner-Array vorhanden ist, 
	 * wird deren Wohneinheit als frei markiert und true zurückgegeben,
	 * ansonsten wird false zurückgegeben
```
Ist das richtig ?


----------



## jono (7. Dez 2019)

Zu #51:
Okay, dann muss ich wohl nochmal schauen, wie ich das mache.


----------



## jono (7. Dez 2019)

Wie wärst du denn vorgegangen als Anfänger, wenn du nicht wüsstest wie du eine Familie einer freien Stelle im Array hinzufügen kannst.


----------



## mihe7 (7. Dez 2019)

Ich hätte mir einen Zettel und einen Stift geschnappt, mir die Situation (das Array) aufgemalt und dann geschaut, wie ich in kleinen Schritten zu einer freien Stelle komme.


----------



## jono (7. Dez 2019)

Okay, ja so werde ich es jetzt auch machen bis zum Erbrechen . Kannst du mir bitte eventuell sagen ob #52 korrekt ist?


----------



## mihe7 (7. Dez 2019)

Ich sags mal so: wenn sich jemand #52 ansieht, dann weiß er, dass das Grundlagenwissen des Autors von #52 gegen Null geht. Der Code ist äquivalent zu:

```
public boolean abmelden(Familie[] someFam) {
        return someFam==bewohner;
    }
```
Abgesehen davon, passt die Methodensignatur nicht zur Aufgabe: "erhält *eine* Familie"


----------



## jono (7. Dez 2019)

Ja, was ich da gemacht habe ist das was man mir Ende der 2. Seite gesagt hat.


----------



## jono (7. Dez 2019)

Wäre die Methodensignatur (Familie someFam) oder? So wurde es auch gesagt.


----------



## mihe7 (7. Dez 2019)

jono hat gesagt.:


> Wäre die Methodensignatur (Familie someFam) oder? So wurde es auch gesagt.


Ja.

EDIT: und nein, das was Du gemacht hast, ist nicht das, was @temi geschrieben hat.


----------



## jono (10. Dez 2019)

```
public boolean abmelden(Familie[] bewohner,Familie someFam, Familie zahl) {
  if (bewohner[someFam]) {
   bewohner[anzahlWohneinheiten--] = zahl;
   return true;
  } else {
   return false;
  }
 }
```

Meine Frage: Ich soll ja überprüfen ob* eine* Familie in "bewohner" enthalten ist. Die anzahlWohneinheiten soll ja um eins vermindert werden wenn "someFam" abgemeldet wird da die Länge der Bewohnerliste der Länge "anzahlWohneinheiten" entspricht. Da anzahlWohneinheiten aber ein Integer ist und someFam vom Typ Familie lässt sich das so vereinbaren? Kann mir einer helfen, in dem ich an dem Code nicht viel ändern muss?


----------



## jono (10. Dez 2019)

```
Implementieren Sie die Methode "anmelden" bzw. "abmelden",      * die ein Familien-Objekt als bewohner hinzufügt bzw. entfernt.      *      * 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;      *      * Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.      * Falls das Familien-Objekt im Bewohner-Array vorhanden ist,      * wird deren Wohneinheit als frei markiert und true zurückgegeben,      * ansonsten wird false zurückgegeben      *
```


----------



## jono (10. Dez 2019)

```
Sorry
```


----------



## jono (10. Dez 2019)

Habe den Text gerade nochmal richtig formatiert eingefügt keine Ahnung warum es nicht geklappt hat , ist für mich auf jeden fall nicht sichtbar

```

```


----------



## jono (10. Dez 2019)

```
Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.     
 Falls das Familien-Objekt im Bewohner-Array vorhanden ist, wird deren Wohneinheit als frei markiert und true zurückgegeben,      ansonsten wird false zurückgegeben.
```


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Ich soll ja überprüfen ob* eine* Familie in "bewohner" enthalten ist.



Dafür benötigst du nur genau *einen* Parameter.
`public boolean abmelden(Familie someFam)`


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Kann mir einer helfen, in dem ich an dem Code nicht viel ändern muss?



Du musst viel verändern, weil alles ziemlicher Unsinn ist.


----------



## jono (10. Dez 2019)

Aber wenn ich dir das so anschaue ist das eigentlich schon richtig , was ist denn daran falsch es so zu machen abgesehen davon dass someFam nicht in dem Array stehen kann


----------



## jono (10. Dez 2019)

Wenn eine Familie enthalten ist, dann wird sie entfernt mit anzahlWohneinheiten --


----------



## jono (10. Dez 2019)

Kannst du mir einen Tipp geben , mit Stift und Papier kommt man zwar weiter, aber hilft mir wirklich nicht weiter, was den Code angeht.


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Aber wenn ich dir das so anschaue ist das eigentlich schon richtig



Das ist mal optimistisch gedacht! Herzlichen Glückwunsch zu dieser Einstellung, aber leider dennoch: alles ziemlich falsch.


----------



## jono (10. Dez 2019)

```
public boolean abmelden(Familie someFam) {
            bewohner[anzahlWohneinheiten--] = someFam;
            for(int i = 0;i<bewohner.length;i++) {
                if(bewohner[i]!=someFam) {
                    return false;
                }
            }
            
            
            return true;
```
Das funktioniert aber und ist korrekt ?


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Kannst du mir einen Tipp geben



Du hast eine Methode der als Parameter eine Familie übergeben wird. Du sollst prüfen, ob diese Familie in der Instanzvariablen "bewohner" enthalten ist. Bei "bewohner" handelt es sich um ein Array.


```
Für jedes Element in bewohner {
    wenn, someFam dem aktuellen Element entspricht {
        markiere das aktuelle Element als frei;
        beende mit true;
    }
}
beende mit false;
```


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Das funktioniert aber und ist korrekt ?



Was ist das für eine Technik, die du da anwendest?

Irgendwas hinschreiben, bis es zufällig einmal stimmt?

Denken und dann programmieren!


----------



## jono (10. Dez 2019)

Ja habe drüber nachgedacht und bin darauf gekommen. Und das müsste stimmten, ich frage nur ob es richtig ist, um zu wissen ob es noch etwas gibt was ich nicht als Anfänger bedacht habe. Aber ich bin der Meinung, dass die Methode so jetzt korrekt ist..


----------



## mihe7 (10. Dez 2019)

temi hat gesagt.:


> Was ist das für eine Technik, die du da anwendest?


Brute Force Attack - redefined.


----------



## mihe7 (10. Dez 2019)

jono hat gesagt.:


> ich frage nur ob es richtig ist


Es wird nicht dadurch richtiger, dass Du dreimal nachfragst.


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Ja habe drüber nachgedacht und bin darauf gekommen. Und das müsste stimmten


Kannst du zu jeder Anweisung kurz erläutern, was sie bewirkt?

Damit man dir gezielt helfen kann und um deine Überlegungen nachvollziehen zu können.



jono hat gesagt.:


> ich frage nur ob es richtig ist


Hast du es ausprobiert?


----------



## jono (10. Dez 2019)

```
1) testFamilie(PublicTests)
java.lang.NullPointerException
    at Haus.<init>(Haus.java:39)
    at PublicTests.testFamilie(PublicTests.java:79)
```

Es ist alles richtig bis auf diese oben genannte Fehlermeldung, wie kann ich diese beheben ?


```
public class Haus {


    private String adresse;
    private int anzahlWohneinheiten;
    private Person besitzer;
    private Familie[] bewohner;
    
    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;
    }
    
    Haus(String adresse,  Person besitzer, int anzahlWohneinheiten){
        this.adresse=adresse;
        this.besitzer=besitzer;
        
        anzahlWohneinheiten = bewohner.length;
        this.bewohner = new Familie[anzahlWohneinheiten];
        
        if(anzahlWohneinheiten<1) {
            anzahlWohneinheiten=1;
        }
        
        
        
    }
    public boolean anmelden(Familie someFam) {
        bewohner[anzahlWohneinheiten++] = 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;
                }
        return true;
    }
    public boolean abmelden(Familie someFam) {
            bewohner[anzahlWohneinheiten--] = someFam;
            for(int i = 0;i<bewohner.length;i++) {
                if(bewohner[i]!=someFam) {
                    return false;
                }
            }
            
            
            return true;
        
    }

    
    
    
    
    
}
```


----------



## jono (10. Dez 2019)

```
public boolean abmelden(Familie someFam) {
            bewohner[anzahlWohneinheiten--] = someFam;
            for(int i = 0;i<bewohner.length;i++) {
                if(bewohner[i]!=someFam) {
                    return false;
                }
            }
            
            
            return true;
```
Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.      
 Falls das Familien-Objekt im Bewohner-Array nicht vorhanden ist, wird false zurückgegeben
ansonsten wird deren Wohneinheit als frei markiert und true zurückgegeben.


----------



## jono (10. Dez 2019)

```
Z. 39: anzahlWohneinheiten = bewohner.length;
```


----------



## kneitzel (10. Dez 2019)

jono hat gesagt.:


> ```
> public boolean abmelden(Familie someFam) {
> bewohner[anzahlWohneinheiten--] = someFam;
> for(int i = 0;i<bewohner.length;i++) {
> ...



Also irgendwie schaffst Du es, mich immer wieder sprachlos zu machen....

Bitte beschreibe doch einmal, was der Code genau machen soll. Wenn die Familie someFam abgemeldet werden soll, dann gehst Du im Ordner mit den Anmeldungen zu einem Objekt, und auf der letzten Seite löscht Du, wer da steht um die Famile, die Du abmelden willst, drauf zu schreiben.

Dann gehst Du den Ordner von Anfang an durch, Wenn dann auf einer Seite nicht die Familie steht, dann bist Du fertig: Familie war nicht da ... (Also wenn auf der ersten Seite jemand anderes steht, dann bist du fertig, und gibst false zurück.)
Und solltest Du durch alle Seiten durch gekommen sein und die Familie nicht gefunden haben, dann gibst Du true zurück (Das kann zum Glück nicht passieren - dafür hast Du die Familie ja schon rein gepackt....)

Sollte die Familie in der Liste gewesen sein dann steht sie evtl. dann doppelt in der Liste?

Und dann noch der Hinweis: Instanzen vergleicht man nicht mit == oder != sondern mit equals. Mag bei Dir noch egal sein, da Du ja nur so generierst und die Instanzen im Speicher hälst, aber das muss ja nicht immer so sein. Sollte schon von den Strings bekannt sein, dass das nicht wirklich gut ist.


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.
> Falls das Familien-Objekt im Bewohner-Array nicht vorhanden ist, wird false zurückgegeben
> ansonsten wird deren Wohneinheit als frei markiert und true zurückgegeben.



Das ist ungefähr der Text der Aufgabe. Ich möchte die Erklärung zu deinem Code. Was soll z.B. `bewohner[anzahlWohneinheiten--] = someFam;` deiner Meinung nach bewirken?


----------



## jono (10. Dez 2019)

Es soll ja eine Familie abgemeldet werden, also müsste "=someFam" nach "bewohner[anzahlWohneinheiten--]" entfernt werden und um den Fall zu vermeiden dass die Familie someFam doppelt vorkommt könnte man mit einer äußeren for Schleife lösen in dem man Index 0 und Index 1 und 1 und 2 miteinander vergleicht undso weiter


----------



## jono (10. Dez 2019)

Ja das bewirkt erstmal nichts sinnvolles mit just no body schon sagt es soll somefam entfernt werden sobald someFam in bewohner enthalten ist, ich überlege mal kurz.


----------



## jono (10. Dez 2019)

Man könnte noch eine if Bedingung mit for Schleife erstellen, wenn bewohner_ =someFam dann soll Anzahl Wohneinheiten um eine Einheit verringert werden_


----------



## temi (10. Dez 2019)

Was bewirkt `bewohner[anzahlWohneinheiten--]` ganz genau?


----------



## jono (10. Dez 2019)

Das bewirkt, dass die Länge des Bewohner Arrays um 1 dekrementiert wird.


----------



## mihe7 (10. Dez 2019)

Falsch. Neuer Versuch.


----------



## jono (10. Dez 2019)

Die Anzahl der Wohneinheiten ist ja äquivalent zu der Anzahl der Familien die man ins bewohner array packen könnte. Also wird eine Familie somit abgemeldet.


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Die Anzahl der Wohneinheiten ist ja äquivalent zu der Anzahl der Familien die man ins bewohner array packen könnte.



Stimmt.



jono hat gesagt.:


> Also wird eine Familie somit abgemeldet.



Falsch.


----------



## temi (10. Dez 2019)

Lieber @jono , alles was du bisher zeigst, deutet sehr sehr deutlich darauf hin, dass dir wichtige Grundlagen fehlen. Ich weiß nicht, ob du das für Schule oder Studium oder für dich privat machst, aber ohne Grundlagen wird es enorm schwierig für dich. So wie jetzt weiter zu arbeiten hat keinen Zweck. Das wird nur deprimierend für dich werden und Programmieren sollte Spaß machen.

Wenn du kannst, dann geh noch mal einige Schritte zurück und befasse dich zunächst mit einfacheren Dingen, bis diese sitzen. Dann löse diese Aufgabe.


----------



## jono (10. Dez 2019)

Die Bewohner-Arraylänge wird dadurch nur verkürzt aber nicht someFam gezielt gelöscht wird.


----------



## jono (10. Dez 2019)

Problem ist diese Aufgabe muss bis morgen abgegeben werden mache das fürs Studium


----------



## mihe7 (10. Dez 2019)

jono hat gesagt.:


> Problem ist diese Aufgabe muss bis morgen abgegeben werden mache das fürs Studium


Vergiss es.


----------



## jono (10. Dez 2019)

Wasrum vergiss es?!


----------



## jono (10. Dez 2019)

Anstatt weiterzuhelfen einfach hängen lassen oder einfach mal diese Kleinigkeit vorzusagen wäre echt kein Akt, das merke ich mir und lerne auch daraus so ist es nicht aber sich so zu äußern wie ihr bringt mich auch null weiter, außerdem ist das eine kleinigkeit an der ich hänge die ich einfach nicht im stande bin zu beheben, weil ich das noch NIE gemacht habe. Der Rest ist schon alles korrekt außer das mit der Methode.


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Die Bewohner-Arraylänge wird dadurch nur verkürzt



Ein Array kann man nicht verkürzen. Es hat immer die Länge wie man es erstellt hat. Die einzige Möglichkeit die Länge eines Arrays zu verändern ist, ein neues längeres/kürzeres Array zu erzeugen und den Inhalt des alten Arrays in das neue Array zu kopieren.


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Anstatt weiterzuhelfen einfach hängen lassen





temi hat gesagt.:


> Du hast eine Methode der als Parameter eine Familie übergeben wird. Du sollst prüfen, ob diese Familie in der Instanzvariablen "bewohner" enthalten ist. Bei "bewohner" handelt es sich um ein Array.
> 
> 
> ```
> ...




```
public boolean abmelden(Familie someFam) {
    for(int i = 0; i < bewohner.length; i++) {
        if(bewohner[i].equals(someFam)) { // damit das wirklich richtig funktioniert muss noch equals() von Familie überschrieben werden
            bewohner[i] = null; // Wohneinheit als frei markieren
            return true;
        }
    }
    return false;
}
```


----------



## kneitzel (10. Dez 2019)

jono hat gesagt.:


> Anstatt weiterzuhelfen einfach hängen lassen oder einfach mal diese Kleinigkeit vorzusagen wäre echt kein Akt, das merke ich mir und lerne auch daraus so ist es nicht aber sich so zu äußern wie ihr bringt mich auch null weiter, außerdem ist das eine kleinigkeit an der ich hänge die ich einfach nicht im stande bin zu beheben, weil ich das noch NIE gemacht habe. Der Rest ist schon alles korrekt außer das mit der Methode.



Also ich finde es interessant, wie du das jetzt darstellst. Seit Donnerstag sind mehrere Leute aktiv dabei, Dir Dinge zu erläutern, aber irgendwie sehe ich nicht wirklich einen Lernerfolg. Das mögen andere anders sehen, aber ich sehe das sehr kritisch.

Was man uns vorwerfen könnte, wäre maximal, dass von uns nicht erst vom Code weggegangen wurde damit Du Dir erst einmal einen Pseudo Code überlegst, wie sowas gehen könnte...

Generell bedeutet Studium, dass man sich selbst Dinge aktiv beibringen muss. Wenn einem irgendwo Grundlagen fehlen, muss man diese eigenständig aufarbeiten.

Aber mal ein paar allgemeine Anregungen:
a) Wenn Du eine Aufgabe lösen sollst, dann überlege Dir erst einmal mit Papier und Stift, was vorher vorliegt, was als Ergebnis gewünscht wird und wie man vom einen Zustand in den anderen kommt. Vergiss dabei Java! Werde Dir erst einmal klar darüber, was für Daten wie vorliegen und was genau gewünscht wird!
b) Schreibe einfachen Code. Anfänger, die tatsächlich meinen, sowas schreiben zu müssen `bewohner[anzahlWohneinheiten--]` sind in meinen Augen etwas dämlich. Sorry wenn ich das so direkt sage, aber Anfänger sollten Code immer so schreiben, dass sie eine Chance haben, ihn zu verstehen. Und dazu gehören so ganz triviale Regeln wie ein Befehl pro Zeile. 

Und nein: Ich glaube nicht, dass das alles ganz neue Dinge sind. Nach meiner Erfahrung gab es zu dieser Thematik bestimmt Vorlesungen und Übungen. Es gibt Professoren und Dozenten - Gerüchte besagen, dass diese Damen und Herren sich nicht von Fragen stellenden Studenten ernähren. Fragen zu stellen ist also nicht wirklich eine Tätigkeit, die als Suizid Versuch einzuordnen ist. Ich habe also nicht wirklich ein schlechtes Gewissen, wenn Du ggf. diese Abgabe nicht schaffst und dann den Stoff noch einmal in Ruhe aufarbeiten kannst um dann nächstes Jahr zu bestehen....


----------



## jono (10. Dez 2019)

Danke @temi ,somit weiß ich für das nächste Mal Bescheid wie ich bei einem ähnlichen Problem eventuell vorgehen kann. Ja es ist schwer zu sagen ab wann man lernerfolg sehen sollte abgesehen kann man so sehen dass ich es können müsste nach den Hilfeanweisungen oder nicht, vielleicht wird es besser und da bin ich ziemlich optimistisch weil ich mir wirklich mühe gebe. Will euch ja gar nicht in dem Sinne schlecht beurteilen das hat damit ja gar nichts zu tun, das ist ja denke ich auch klar. 
Eine Frage hätte ich da noch zu der vorher beschriebenen Fehlermeldung, warum habe ich da eine nullpointerexception?


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Eine Frage hätte ich da noch zu der vorher beschriebenen Fehlermeldung, warum habe ich da eine nullpointerexception?



Kannst du dir vorstellen, was die Meldung bedeutet?

Schau dir mal diese beiden Zeilen an:

```
anzahlWohneinheiten = bewohner.length;
this.bewohner = new Familie[anzahlWohneinheiten];
```

Edit: Außerdem sind noch mehr Fehler in dieser Methode im Konstruktor, sowie in der Methode anmelden().


----------



## Xknight (10. Dez 2019)

Was für Fehler denn??? Ich sehe da keine Fehler. Auch in der Methode anmelden sind keine Fehler.


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Was für Fehler denn??? Ich sehe da keine Fehler. Auch in der Methode anmelden sind keine Fehler.


Ja ja


----------



## Xknight (10. Dez 2019)

Wo sind denn Fehler und was würdest du besser machen?


----------



## 1337Avdu (10. Dez 2019)

Ich sehe da auch keine Fehler, bis auf die Nullpointer ^^


----------



## temi (10. Dez 2019)

Witzig! Ich nehme mal an es handelt sich um Kommilitonen...


```
Haus(String adresse,  Person besitzer, int anzahlWohneinheiten){
    this.adresse = adresse;
    this.besitzer = besitzer;
     
    anzahlWohneinheiten = bewohner.length; // Welcher Variablen wird hier etwas zugewiesen?
    this.bewohner = new Familie[anzahlWohneinheiten];
     
    if (anzahlWohneinheiten < 1) { // Was soll das bezwecken?
        anzahlWohneinheiten = 1;
    }
}
```


----------



## Xknight (10. Dez 2019)

Laut der Aufgabe bestimmt die azahlWohneinheiten die Länge des Arrays und wenn die anzahlWohneinheiten kleiner eins ist soll anzahlWohneinheiten eins sein.
Das soll damit gemeint sein. Darum sehe ich im Konstruktor keine Fehler.


----------



## 1337Avdu (10. Dez 2019)

Wir sind Schulkameraden und am verzweifeln haben Informatik als Grundkurs aber die Aufgabe hats schon in sich ^^


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Laut der Aufgabe bestimmt die azahlWohneinheiten die Länge des Arrays und wenn die anzahlWohneinheiten kleiner eins ist soll anzahlWohneinheiten eins sein.
> Das soll damit gemeint sein. Darum sehe ich im Konstruktor keine Fehler.



Das ist mir schon klar, aber was soll die Abfrage *nachdem* das Array bereits erzeugt wurde?


----------



## Xknight (10. Dez 2019)

Welche Abfrage meinst du denn?


----------



## temi (10. Dez 2019)

Heiligs Blechle!  

`if (anzahlWohneinheiten < 1)`


----------



## Xknight (10. Dez 2019)

In der Methode anmelden() sollen wir in einer freien Stellen einen Bewohner hinzufügen.
So lautet mein Quellcode.
Da sehe ich keinen Fehler.

```
public boolean anmelden(Familie someFam) {
         for(int i = 0; i < bewohner.length; i++) {
                if(bewohner[i] == null) {
                    bewohner[anzahlWohneinheiten++] = 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;
                }
        return true;
    }
```
Mit dieser Abfrage überprüfe ich ob die anzahlWohneinheiten kleiner 1 ist und mit den for-Schleifen überprüfe ich ob Redundanzen im Array vorhanden sind.


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Da sehe ich keinen Fehler.



Doch. Ist fehlerhaft.

Warum will hier jeder das Feld anzahlWohneinheiten hochzählen? Die Anzahl der Wohneinheiten wird im Konstruktor festgelegt und ändert sich nicht mehr. Das hier Werte über Setter-Methoden geändert werden können ist gequirlte Scheiße, aber da könnt ihr nichts dafür, dass will eure Aufgabe so. Aber soweit ich die Aufgabe für anmelden() richtig im Kopf habe, muss hier die Anzahl der Wohneinheiten dieses Hauses nicht geändert werden. Eine freie Wohneinheit soll gesucht und durch eine Familie belegt werden, sofern diese Familie nicht schon im Haus wohnt.



Xknight hat gesagt.:


> überprüfe ich ob Redundanzen im Array vorhanden sind.



Sollte man das nicht vor dem Einfügen der neuen Familie machen?


----------



## Xknight (10. Dez 2019)

Da hast du recht mit den Rudandanzen, aber bei einer frei leer markierten Stelle soll ein Bewohner hinzugefügt werden und dass habe ich mit diesem code bewohner[anzahlWohneinheiten++] gemacht oder wie siehst du es?


----------



## Xknight (10. Dez 2019)

So sieht meine neue Methode aus

```
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;
                }else  if(bewohner[i] == null) { 
                    bewohner[anzahlWohneinheiten++] = someFam; 
                }
        return true;
    }
```


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Da hast du recht mit den Rudandanzen, aber bei einer frei leer markierten Stelle soll ein Bewohner hinzugefügt werden und dass habe ich mit diesem code bewohner[anzahlWohneinheiten++] gemacht oder wie siehst du es?


Hast du nicht.

Nehmen wir mal an es gibt 10 Wohneinheiten. Du hast also ein Array "bewohner" mit der Größe 10 erstellt. Mit deinem Code weist du bewohner[10] (weil anzahlWohneinheiten = 10) eine neue Familie zu und erhöhst danach die Anzahl auf 11.


bewohner[10] verursacht eine Exception, weil der höchste Index 9 ist
Du möchtest an der freien Stelle eine Familie zuweisen. Machst du aber nicht.
Die Anzahl der Wohneinheiten soll sich nicht ändern.
Du solltest vor der Zuweisung prüfen, ob die Familie schon im Haus ist


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> So sieht meine neue Methode aus


Du brauchst KEINE verschachtelte Schleife.


----------



## Xknight (10. Dez 2019)

Warum das nicht?


----------



## Xknight (10. Dez 2019)

Wie sieht denn dein Lösungsvorschlag denn aus?


----------



## lennero (10. Dez 2019)

Xknight hat gesagt.:


> Warum das nicht?



Was macht die verschachtelte Schleife deiner Meinung nach?


----------



## Xknight (10. Dez 2019)

Die überprüft ob ein Wert im Array doppelt vorkommt und wenn ja gibt er es als false zurück und wenn nicht fügt er ein Bewohner hinzu in der frei markierten Stelle


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Wie sieht denn dein Lösungsvorschlag denn aus?


Ich schlage vor, ihr beginnt mal zu denken. Das ist echt sehr einfach (also das Problem, das Denken anscheinend nicht).

Die erste Schleife deiner ursprünglichen Lösung war schon fast richtig. Du musst nur die Familie an die richtige Stelle im Array zuweisen. Und was ist die richtige Stelle? Wo hast du denn den freien Platz gefunden?

Für die Prüfung, ob die Familie bereits existiert, *kopiere* die Schleife und setze sie *vor* der Schleife mit der Zuweisung. Dann passt du die Abfrage an und sobald eine identische Familie gefunden ist, kannst du mit return false; die Methode verlassen.


----------



## Xknight (10. Dez 2019)

Danke, aber was war noch mal meine ursprüngliche Lösung?


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Warum das nicht?


Weil du eigentlich nicht wissen willst, ob es doppelte Einträge gibt. Du möchtest wissen, ob die Familie, die angemeldet werden soll, bereits vorhanden ist. Dafür musst du nur einmal durch die bewohner schauen. Und das machst du *bevor* du die Familie einfügst.


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> In der Methode anmelden() sollen wir in einer freien Stellen einen Bewohner hinzufügen.
> So lautet mein Quellcode.
> Da sehe ich keinen Fehler.
> 
> ...



Oh Mann. Ihr seid ja echt drauf!


----------



## Xknight (10. Dez 2019)

Soll ich dann schrreiben:

```
bewohner[i] = somefam
```


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Muss ich dann bewohner_ = somefam schreiben. Wäre das korrekt?_


Nein. Du musst schon einen Index angeben. Schau dir doch einfach den Vergleich eine Zeile vorher an! Wo hast du die freie Stelle gefunden?


----------



## mihe7 (10. Dez 2019)

jono hat gesagt.:


> Anstatt weiterzuhelfen einfach hängen lassen oder einfach mal diese Kleinigkeit vorzusagen wäre echt kein Akt, das merke ich mir und lerne auch daraus so ist es nicht aber sich so zu äußern wie ihr bringt mich auch null weiter, außerdem ist das eine kleinigkeit an der ich hänge die ich einfach nicht im stande bin zu beheben, weil ich das noch NIE gemacht habe. Der Rest ist schon alles korrekt außer das mit der Methode.


Jono, das Thema Arrays hatten wir ausführlichst unter https://www.java-forum.org/thema/zw...-und-in-eindimensionales-ueberfuehren.186409/ Dort wurde Dir in über 300(!) Beiträgen der Spaß x-mal erklärt und das ist jetzt 14 Tage her.

Hier geht es um die Umsetzung eines einfachen Algorithmus, den Du erstens sofort hinschreiben können müsstest und Dir @temi in #73 haarklein aufgeschrieben hat. 

Noch genauer "helfen" würde bedeuten, Dir den fertigen Code zu geben. Das gibt es hier normalerweise nicht.


----------



## kneitzel (10. Dez 2019)

```
Haus(String adresse,  Person besitzer, int anzahlWohneinheiten){
    ...
    anzahlWohneinheiten = bewohner.length; // Welcher Variablen wird hier etwas zugewiesen?
    ...
}
```

Also was für einen Sinn macht ein Parameter, wenn ihr den Wert ignoriert und einfach irgendwie überschreibt?


```
public boolean anmelden(Familie someFam) {
         for(int i = 0; i < bewohner.length; i++) {
                if(bewohner[i] == null) {
                    bewohner[anzahlWohneinheiten++] = someFam;
                }
         }
    ...
    }
```

Was macht Ihr da? Ihr sucht eine freie Stelle und dann ignoriert ihr die freie Stelle und packt es einfach woanders rein?


----------



## Xknight (10. Dez 2019)

temi hat gesagt.:


> Nein. Du musst schon einen Index angeben. Schau dir doch einfach den Vergleich eine Zeile vorher an! Wo hast du die freie Stelle gefunden?


Habe ich doch mit

```
bewohner[i]=someFam
```
Ist das  endlich korrekt?


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Habe ich doch mit
> 
> ```
> bewohner[i]=someFam
> ...


Halleluja!
Zeig noch mal den gesamten Code.


----------



## Xknight (10. Dez 2019)

Danke, aber was ist noch im Konstruktor falsch, da ich laut der Aufgabe, vermute ich mal, es richtig programmiert habe?


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Danke, aber was ist noch im Konstruktor falsch, da ich laut der Aufgabe, vermute ich mal, es richtig programmiert habe?


#107 und #110 und #130 die obere Hälfte.


----------



## Xknight (10. Dez 2019)

Bin neu hier und darum weiss ich nicht was mit diesen # gemeint sind.


----------



## mihe7 (10. Dez 2019)

Xknight hat gesagt.:


> Bin neu hier und darum weiss ich nicht was mit diesen # gemeint sind.


Das sind die Kommentarnummern, die Du über jedem Kommentar rechts oben siehst.


----------



## kneitzel (10. Dez 2019)

Das sind die Nummern der Beiträge. Findest Du oberhalb auf der Rechten Seite.

Und #130 zeigt es auch noch einmal etwas auf. Wie kann es richtig programmiert sein, wenn Du ein Argument, das vorgegeben ist, nicht verwendest?

Wie kann man fragen, ob etwas richtig ist, wenn ihr eine NullPointerException bekommen habt?

Was macht der Konstruktor? Ein Konstruktor ist doch dazu da, Dinge zu initialisieren. Wie kommt ihr auf die Idee, auf ein Element zugreifen zu können, dass noch nicht initialisiert ist?

@temi: Wie schaffst Du es, das auszuhalten?


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Bin neu hier und darum weiss ich nicht was mit diesen # gemeint sind.


Die Nummer des Beitrags, wird ganz rechts angezeigt.


----------



## temi (10. Dez 2019)

JustNobody hat gesagt.:


> @temi: Wie schaffst Du es, das auszuhalten?



Ach, ich hol mir gleich ein Bier.


----------



## Xknight (10. Dez 2019)

Das Ding ist wir haben doch beim Konstruktor alles definiert und wir sollten nur die übernehmen.


----------



## mihe7 (10. Dez 2019)

1. Was bewirkt dieser Code?

```
void doSomething(int x) {
   if (x < 1) {
       x = 1;
   }
}
```

2. Was bewirkt dieser Code?

```
Haus(int x) {
    x = bewohner.length;
}
```


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Das Ding ist wir haben doch beim Konstruktor alles definiert und wir sollten nur die übernehmen.



Ach Leute. Was ist denn so schwer daran mal die Kommentare durchzulesen und dann darüber nachzudenken.


```
Haus(String adresse,  Person besitzer, int anzahlWohneinheiten){
    this.adresse = adresse;
    this.besitzer = besitzer;
    
    anzahlWohneinheiten = bewohner.length; // Welcher Variablen wird hier etwas zugewiesen?
    this.bewohner = new Familie[anzahlWohneinheiten];
    
    if (anzahlWohneinheiten < 1) { // Was soll das bezwecken?
        anzahlWohneinheiten = 1;
    }
}
```


----------



## Xknight (10. Dez 2019)

* Implementieren Sie einen Konstruktor mit adresse, besitzer und anzahlWohneinheit als Parameter.     
 * Die Adresse und der Besitzer sollen übernommen werden.     
 * Wenn die Anzahl der Wohneinheiten kleiner als 1 sein sollte, dann soll 1 dafür verwendet werden.     
 * Die Anzahl der Wohneinheiten definiert die Länge des Arrays der Bewohner. 
 * Zu Beginn wohnen keine Bewohner und die Elemente des Arrays sind alle "null".
Also habe ich genau so programmiert im Konstruktor.


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> * Implementieren Sie einen Konstruktor mit adresse, besitzer und anzahlWohneinheit als Parameter.
> * Die Adresse und der Besitzer sollen übernommen werden.
> * Wenn die Anzahl der Wohneinheiten kleiner als 1 sein sollte, dann soll 1 dafür verwendet werden.
> * Die Anzahl der Wohneinheiten definiert die Länge des Arrays der Bewohner.
> ...



Ist dein Konstruktor anders, als der von jono aus #142? Der in #142 ist fehlerhaft.


----------



## albanhu (10. Dez 2019)

Xknight hat gesagt.:


> * Implementieren Sie einen Konstruktor mit adresse, besitzer und anzahlWohneinheit als Parameter.
> * Die Adresse und der Besitzer sollen übernommen werden.
> * Wenn die Anzahl der Wohneinheiten kleiner als 1 sein sollte, dann soll 1 dafür verwendet werden.
> * Die Anzahl der Wohneinheiten definiert die Länge des Arrays der Bewohner.
> ...


Ich hatte die Aufgabe auch mal und bei mir wurde die ganze Zeit auch die Fehlermeldung angezeigt …
Falls du es gelöst hast könntest mal erklären wie du es geschafft hast ? wäre echt cool


----------



## Xknight (10. Dez 2019)

```
Haus(String adresse,  Person besitzer, int anzahlWohneinheiten){
        this.adresse=adresse;
        this.besitzer=besitzer;
        
        anzahlWohneinheiten = bewohner.length;
        this.bewohner = new Familie[anzahlWohneinheiten];
        
        if(anzahlWohneinheiten<1) {
            anzahlWohneinheiten=1;
        }
```
Genau so steht es bei mir?


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Genau so steht es bei mir?



Ist das jetzt eine Antwort oder fragst du dich noch, ob es wirklich so bei dir steht?

Ist auf jeden Fall nicht korrekt.


----------



## mihe7 (10. Dez 2019)

@temi mit nem Bier ist es da nicht getan.


----------



## kneitzel (10. Dez 2019)

Xknight hat gesagt.:


> * Die Anzahl der Wohneinheiten definiert die Länge des Arrays der Bewohner.


Was bedeutet A definiert B?

Bedeutet das, dass A durch B gegeben (definiert) wird oder dass b durch a bestimmt (definiert) wird?


----------



## Xknight (10. Dez 2019)

Warum sollte es nicht korrekt sein? Genau das habe ich getan was in der Aufgabe steht.


----------



## mihe7 (10. Dez 2019)

Das siehst Du, wenn Du die Fragen beantwortest.


----------



## jono (10. Dez 2019)

Das bedeutet dass b durch a bestimmt wird


----------



## mihe7 (10. Dez 2019)

Jetzt beantwortet Ihr noch die Fragen aus #142 (oder wenn Euch Fragen in Kommentaren überfordern #141).


----------



## temi (10. Dez 2019)

Es ist doch wirklich ganz einfach:


```
Haus(String adresse,  Person besitzer, int anzahlWohneinheiten){
    ...
    anzahlWohneinheiten = bewohner.length; // Welcher Variablen wird hier etwas zugewiesen?
    ...
}
```

Welcher Variablen wird hier etwas zugewiesen?

Und behaupte bloß nicht wieder dass alles richtig ist!


----------



## 1337Avdu (10. Dez 2019)

Also laut #141 bewirkt der erste code das x 1 gesetzt wird wenn x kleiner als 1 ist,
Und der zweite code deklariert dann x = bewohner.lenght bzw 1 = bewohner.lenght


----------



## Xknight (10. Dez 2019)

in der methode doSomething wird überprüft ob x kleiner eins ist und im Konstruktor haus ist x die Länge des arrays d.h. die Länge des Arrays ist eins


----------



## mihe7 (10. Dez 2019)

Xknight hat gesagt.:


> in der methode doSomething wird überprüft ob x kleiner eins ist


Eine Überprüfung bewirkt aber noch nichts.



Xknight hat gesagt.:


> im Konstruktor haus ist x die Länge des arrays d.h. die Länge des Arrays ist eins


Woher nimmst Du die Information, dass das Array eine Länge von 1 hätte?


----------



## temi (10. Dez 2019)

Oh Gott @mihe7, was hast du getan!


----------



## jono (10. Dez 2019)

@mihe

```
1.
void doSomething(int x) {  // hier wird die Bedingung festgelegt, falls x kleiner eins sein sollte, soll es der 1 gleichgesetzt werden. 
   if (x < 1) {
       x = 1;
   }
}
2.
Haus(int x) {
    x = bewohner.length;
}
Hier wird dem x die Länge des Bewohnerarrays zugewiesen.
```


----------



## jono (10. Dez 2019)

Aufrunden in jedem Fall für kleiner 1 auf 1 wäre dann doch korrekt?


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Hier wird dem x die Länge des Bewohnerarrays zugewiesen.



Und ist das sinnvoll? Was ist denn "x"?


----------



## jono (10. Dez 2019)

mit Math.ceil(anzahlWohneinheiten)


----------



## jono (10. Dez 2019)

x soll die Anzahl der Wohneinheiten darstellen


----------



## temi (10. Dez 2019)

Leute ihr schweift ab. Kommt zurück!


----------



## Xknight (10. Dez 2019)

Nein @jono man soll das Array im Konstruktor definieren.


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> x soll die Anzahl der Wohneinheiten darstellen



Könnte x der Parameter sein? Vielleicht?


----------



## jono (10. Dez 2019)

Bewohner.length =anzahlWohneinheiten


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> Bewohner.length =anzahlWohneinheiten


Du kannst bewohner.length nichts zuweisen.


----------



## kneitzel (10. Dez 2019)

jono hat gesagt.:


> Bewohner.length =anzahlWohneinheiten


Wir kommen in die richtige Richtung!

Was ist bewohner für ein Typ? Wie kann man den initialisieren, so dass bewohner.length = anzahlWohneinheiten ist?


----------



## jono (10. Dez 2019)

Stimmt sorry


----------



## Xknight (10. Dez 2019)

Wir sollen das Array im Konstruktor übernehmen.


----------



## mihe7 (10. Dez 2019)

@jono In #159 hast Du die Fragen schon mal nicht falsch beantwortet. Ein wesentlicher Punkt:



Xknight hat gesagt.:


> Nein @jono man soll das Array im Konstruktor definieren.



Ihr greift auf ein Array zu, das noch gar nicht(*) initialisiert ist. Welchen Wert hat bewohner also zu diesem Zeitpunkt? Richtig, null. Folglich wird beim Versuch, auf die Längen-Eigenschaft des bewohner-Arrays (bewohner.length) eine NullPointerException auftreten. Das war die Frage zu 2.

Bei der Frage zu 1.: x ist ein Parameter. Dem wird nun ein Wert zugewiesen. Was soll das bringen?

EDIT: (*) das war von mir schlampig formuliert. Es wurde noch kein Array erzeugt. Die Instanzvariable bewohner ist selbstverständlich mit null initialisiert.


----------



## Xknight (10. Dez 2019)

Wir haben den Array schon oberhalb des Konstruktors definiert.


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Wir haben den Array schon oberhalb des Konstruktors definiert.


Ihr habt eine Feldvariable oder Instanzvariable für ein Array deklariert, aber diese Variable ist null solange sie nicht initialisiert wird.


----------



## kneitzel (10. Dez 2019)

Xknight hat gesagt.:


> Wir haben den Array schon oberhalb des Konstruktors definiert.


Dann bitte noch einmal anschauen, wie man ein Array deklariert und wie man es initialisiert. Was ihr habt ist nur eine Deklaration. Daher kommt auch die NullPointerException, wenn ihr darauf zugreift.
Wie initialisiert man ein Array mit einer bestimmten Länge?


----------



## jono (10. Dez 2019)

```
Familie[] Bewohner = new int [10]
```


----------



## Xknight (10. Dez 2019)

```
this.bewohner = new Familie[anzahlWohneinheiten];
```
Ich habe es doch hier den Array initialisiert.


----------



## mihe7 (10. Dez 2019)

Xknight hat gesagt.:


> ```
> this.bewohner = new Familie[anzahlWohneinheiten];
> ```
> Ich habe es doch hier den Array initialisiert.


Ja, aber erst nachdem Du auf bewohner.length zugreifst.



jono hat gesagt.:


> ```
> Familie[] Bewohner = new int [10]
> ```


Das wäre Deklaration und Initialisierung in einem. Schreib das mal getrennt. EDIT: Und warum int???


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> ```
> this.bewohner = new Familie[anzahlWohneinheiten];
> ```
> Ich habe es doch hier den Array initialisiert.



Korrekt, aber eine Zeile oberhalb versuchst du auf das noch nicht initialisierte Array zuzugreifen (mit benutzer.length).


----------



## jono (10. Dez 2019)

Die Zeile löschen?


----------



## mihe7 (10. Dez 2019)

jono hat gesagt.:


> Die Zeile löschen?


Worauf bezieht sich Dein Kommentar?


----------



## Xknight (10. Dez 2019)

```
Haus(String adresse,  Person besitzer, int anzahlWohneinheiten, Familie[] bewohner){
        this.adresse=adresse;
        this.besitzer=besitzer;
        
        
        this.bewohner = new Familie[anzahlWohneinheiten];
        anzahlWohneinheiten=bewohner.length;
        
        if(anzahlWohneinheiten<1) {
            anzahlWohneinheiten=1;
        }
        
        
        
    }
```
Das hatte ich schon die ganze Zeit


----------



## jono (10. Dez 2019)

@mihe int ist ein Fehler, war son Automatismus


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Das hatte ich schon die ganze Zeit


Ein paar Seiten vorher hast du etwas anderes behauptet.


----------



## temi (10. Dez 2019)

temi hat gesagt.:


> Ein paar Seiten vorher hast du etwas anderes behauptet.



Sind aber immer noch zwei Fehler drin.


----------



## jono (10. Dez 2019)

```
this.bewohner = new Familie[anzahlWohneinheiten];
        anzahlWohneinheiten=bewohner.length;
```
auf die Zeile die vorher überhalb der Array Initialisierung stand


----------



## mihe7 (10. Dez 2019)

Xknight hat gesagt.:


> Das hatte ich schon die ganze Zeit


Dann ist Punkt 2 bei Dir auch kein Problem. Bleibt Punkt 1: was bringt es, wenn Du dem Parameter anzahlWohneinheiten die Länge des Arrays zuweist?



jono hat gesagt.:


> auf die Zeile die vorher überhalb der Array Initialisierung stand


Ja. Im Folgenden gehe ich von dem Code aus #182 aus. Sprich: die Frage bleibt, was es bringt, einem Parameter einen Wert zuzuweisen.


----------



## jono (10. Dez 2019)

```
* Implementieren Sie einen Konstruktor mit adresse, besitzer und anzahlWohneinheit als Parameter.
Haus(String adresse,  Person besitzer, int anzahlWohneinheiten, Familie[] bewohner){ // Familie[]bewohner muss raus
```


----------



## Xknight (10. Dez 2019)

Habe ich schon


----------



## jono (10. Dez 2019)

@mihe7 
Bringt einem gar nichts.


----------



## mihe7 (10. Dez 2019)

jono hat gesagt.:


> @mihe7
> Bringt einem gar nichts.


Und warum macht Ihr es dann?


----------



## 1337Avdu (10. Dez 2019)

@mihe7 ich glaube du brauchst kein Bier sondern was hochprozentiges mein Freund!


----------



## mihe7 (10. Dez 2019)

jono hat gesagt.:


> ```
> * Implementieren Sie einen Konstruktor mit adresse, besitzer und anzahlWohneinheit als Parameter.
> Haus(String adresse,  Person besitzer, int anzahlWohneinheiten, Familie[] bewohner){ // Familie[]bewohner muss raus
> ```


BTW: genau das ist das Prinzip: sich zu 100 % an die Aufgabenstellung halten. Die sind am Anfang so genau geschrieben, dass man sie fast 1:1 in Code übersetzen kann, wie man an diesem Beispiel sieht.


----------



## jono (10. Dez 2019)

Gute Frage, da man das Array schon initialisiert hat , ist die Länge des Bewohnerarrays sowieso schon durch die anzahlWohneinheiten definiert


----------



## mihe7 (10. Dez 2019)

1337Avdu hat gesagt.:


> @mihe7 ich glaube du brauchst kein Bier sondern was hochprozentiges mein Freund!


Seit dem Java-Forum bin ich auf intravenös umgestiegen


----------



## temi (10. Dez 2019)

Schaut euch mal eure Instanzvariablen an. Gibt es da evtl. eine die auch so heißt, wie der Parameter?


----------



## kneitzel (10. Dez 2019)

mihe7 hat gesagt.:


> Seit dem Java-Forum bin ich auf intravenös umgestiegen


Das erklärt Alles! Den Tipp hättest Du mir schon viel früher geben können! Ich hätte hier schon eine eigene Einspritzanlage in Betrieb haben können!


----------



## temi (10. Dez 2019)

Und bezogen auf den Code von #182: Ruft mal die Methode mit anzahlWohneinheiten = -10 auf oder spielt diesen Aufruf mal gedanklich durch.


----------



## mihe7 (10. Dez 2019)

JustNobody hat gesagt.:


> Das erklärt Alles! Den Tipp hättest Du mir schon viel früher geben können! Ich hätte hier schon eine eigene Einspritzanlage in Betrieb haben können!


Alles Junkies hier.


----------



## Xknight (10. Dez 2019)

temi hat gesagt.:


> Schaut euch mal eure Instanzvariablen an. Gibt es da evtl. eine die auch so heißt, wie der Parameter?


Unsere Instanzvariablen heißen genau wie unsere Parameter @temi


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Unsere Instanzvariablen heißen genau wie unsere Parameter @temi



Möchtet ihr der Instanzvariablen this.anzahlWohneinheiten vielleicht auch einen Wert zuweisen?


----------



## jono (10. Dez 2019)

Ja, die Instanzvariable ist mit dem Parametername identisch ?...


----------



## kneitzel (10. Dez 2019)

Xknight hat gesagt.:


> ```
> Haus(String adresse,  Person besitzer, int anzahlWohneinheiten, Familie[] bewohner){
> this.adresse=adresse;
> this.besitzer=besitzer;
> ...



Dann teste doch einmal, was passiert, wenn Du anzahlWohneinheiten beim Aufruf -1 oder so mitgibst.

Also wenn ihr einen Code habt, dann testet ihn doch. Wenn ihr eine NPE bekommt oder das Ergebnis nicht stimmt, dann habt ihr was falsch gemacht. Wenn ihr hier von einem Fehler redet ("Ich bekomme da eine NPE"), dann sagt bitte auch, wenn ihr so ein Problem gelöst bekommt.


----------



## jono (10. Dez 2019)

```
Implementieren Sie einen Konstruktor mit adresse, besitzer und anzahlWohneinheit als Parameter.
Die Adresse und der Besitzer sollen übernommen werden.
```
Dachte dass kein Wert aufgrund dieser Aussage zugewiesen werden soll bzw. kein this.anzahlWohneinheiten instanziiert werden soll


----------



## Xknight (10. Dez 2019)

Wir sollten noch ni


JustNobody hat gesagt.:


> Dann teste doch einmal, was passiert, wenn Du anzahlWohneinheiten beim Aufruf -1 oder so mitgibst.
> 
> Also wenn ihr einen Code habt, dann testet ihn doch. Wenn ihr eine NPE bekommt oder das Ergebnis nicht stimmt, dann habt ihr was falsch gemacht. Wenn ihr hier von einem Fehler redet ("Ich bekomme da eine NPE"), dann sagt bitte auch, wenn ihr so ein Problem gelöst bekommt.


Danke für alles Leute aber ich versuche gerade meine AssertionErros zu lösen, aber geht auch nicht so wie ich es will in der class Familie.


----------



## temi (10. Dez 2019)

jono hat gesagt.:


> ```
> Implementieren Sie einen Konstruktor mit adresse, besitzer und anzahlWohneinheit als Parameter.
> Die Adresse und der Besitzer sollen übernommen werden.
> ```
> Dachte dass kein Wert aufgrund dieser Aussage zugewiesen werden soll bzw. kein this.anzahlWohneinheiten *instanziiert* werden soll



Ja, du könntest recht haben. Allerdings gibt es ja diese Instanzvariable. Wird sie vielleicht in einer anderen Aufgabe zugewiesen?

Müsst ihr halt noch mal schauen, das ist von hier nicht zu klären. Übrigens "instanziiert" ist in diesem Fall das falsche Wort.

Aber ihr werden auf jeden Fall einen Fehler erhalten, wenn ihr den Konstruktor mit einer negativen Anzahl von Wohneinheiten aufruft. Das wurde hier auch schon diskutiert, warum das so ist: Eure Kontrolle, ob der Parameter kleiner als 1 ist findet statt, wenn das Array bereits erzeugt wurde (bzw. der Versuch unternommen wird).


----------



## Xknight (10. Dez 2019)

temi hat gesagt.:


> Ja, du könntest recht haben. Allerdings gibt es ja diese Instanzvariable. Wird sie vielleicht in einer anderen Aufgabe zugewiesen?
> 
> Müsst ihr halt noch mal schauen, das ist von hier nicht zu klären. Übrigens "instanziiert" ist in diesem Fall das falsche Wort.
> 
> Aber ihr werden auf jeden Fall einen Fehler erhalten, wenn ihr den Konstruktor mit einer negativen Anzahl von Wohneinheiten aufruft. Das wurde hier auch schon diskutiert, warum das so ist: Eure Kontrolle, ob der Parameter kleiner als 1 ist findet statt, wenn das Array bereits erzeugt wurde (bzw. der Versuch unternommen wird).


Ja beim an und abmelden kommt auch ein assertionerror


----------



## mihe7 (10. Dez 2019)

Mal zusammenfassend:

```
Haus(String adresse,  Person besitzer, int anzahlWohneinheiten){
        this.adresse=adresse;
        this.besitzer=besitzer;
       
        if(anzahlWohneinheiten<1) {
            // die Zuweisung an den Parameter ist nicht die feine Art,
            // bringt hier aber was, weil der Wert gleich noch 
            // verwendet wird.
            anzahlWohneinheiten=1;          
        }
       
        this.bewohner = new Familie[anzahlWohneinheiten];
        // ggf. noch
        // this.anzahlWohneinheiten = anzahlWohneinheiten;
    }
```


----------



## jono (10. Dez 2019)

```
/root/autocorrectorj3tUTvdir/PublicTests.java:19: error: incompatible types: Person cannot be converted to int
		Haus h = new Haus("Das ist die Adresse", p1, 2);
		                                         ^
/root/autocorrectorj3tUTvdir/PublicTests.java:43: error: incompatible types: Person cannot be converted to int
		Haus h1 = new Haus("Adresse", besitzer, 3);
		                              ^
/root/autocorrectorj3tUTvdir/PublicTests.java:79: error: incompatible types: Person cannot be converted to int
		Haus h1 = new Haus("Endlosstr. 5, Im Nimmerland", besitzer, 3);
		                                                  ^
/root/autocorrectorj3tUTvdir/PublicTests.java:97: error: incompatible types: Person cannot be converted to int
		Haus h2 = new Haus("Endlosstr. 2, Im Nimmerland", besitzer, 3);
		                                                  ^
```


----------



## Xknight (10. Dez 2019)

Was ist an meinem class Familie falsch

```
public class Familie {

    private String name;
    private Haus meldung;
    private Person[] familienmitglieder;
    
    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;
    }
    
    
    
    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)&&meldung.abmelden(this)==true) {
            return true;
        }
        if(meldung.anmelden(this)==true && meldung.abmelden(this)==false) {
            meldung.abmelden(this);
        }
        return false;
    }
    
}
```
Bekomme immer diese Fehlermeldung

```
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)
```


----------



## jono (10. Dez 2019)

Das wird das sein was ihr meint, dass es mit -1 nicht funktioniert nh?


----------



## Xknight (10. Dez 2019)

Habe alles versucht aber hat nix gebracht


----------



## temi (10. Dez 2019)

Macht mal eure Konstruktoren *public*!


----------



## mihe7 (10. Dez 2019)

Zu #210: mindestens mal das gleiche Problem wie vorhin: schaut Euch die Parameternamen und die Namen der Instanzvariablen an. Was soll das hier bringen:

```
public boolean ummelden(Haus meldung) {
        if(meldung.anmelden(this)&&meldung.abmelden(this)==true) {
```
Ihr meldet Euch erstmal an und dann wieder ab. Den Vergleich mit true könnt Ihr Euch sparen.


----------



## Xknight (10. Dez 2019)

* Die "Familie" hat folgende private-Eigenschaften     #
 *  - "name" vom Typ String     
 *  - "meldung" vom Typ Haus    
  *  - "familienmitglieder" vom Typ Person-Array      *     
 * Erstellen Sie Standard Getter und Setter für alle Eigenschaften.      * (Bitte automatisch generieren lassen!)      *      
* Implementieren Sie einen Konstruktor mit name, meldung und familienmitglieder als Parameter.      
* Die Parameter-Werte vom Konstruktor sollen bei den Klasseneigenschaften übernommen werden.      *     
 * Implementieren Sie eine public-Methode "ummelden",      
* der die Familie vom alten Haus abmeldet und in ein neues Haus anmeldet.      
* Die public-Methode "ummelden" erhält ein Haus und gibt ein boolean zurück.      
* Die Methode liefert nur dann true, wenn das Anmelden und Abmelden funktioniert hat und      
* die Meldung aktualisiert wurde.      
* Wenn zum Beispiel die Anmeldung funktioniert aber die Abmeldung nicht, dann muss die Anmeldung      
* wieder rückgängig gemacht werden, bevor false zurückgegeben wird.      *      
* Zum An- und Abmelden kann die Methode aus Haus verwendet werden      
* z.B. meldung.abmelden(this); würde dieses Objekt von dem gemeldeten Haus abmelden.      *  
Das habe ich doch gemacht laut meiner Aufgabe


----------



## jono (10. Dez 2019)

```
/root/autocorrectorj3tUTvdir/PublicTests.java:19: error: incompatible types: Person cannot be converted to int
		Haus h = new Haus("Das ist die Adresse", p1, 2);
		                                         ^
/root/autocorrectorj3tUTvdir/PublicTests.java:43: error: incompatible types: Person cannot be converted to int
		Haus h1 = new Haus("Adresse", besitzer, 3);
		                              ^
/root/autocorrectorj3tUTvdir/PublicTests.java:79: error: incompatible types: Person cannot be converted to int
		Haus h1 = new Haus("Endlosstr. 5, Im Nimmerland", besitzer, 3);
		                                                  ^
/root/autocorrectorj3tUTvdir/PublicTests.java:97: error: incompatible types: Person cannot be converted to int
		Haus h2 = new Haus("Endlosstr. 2, Im Nimmerland", besitzer, 3);
		                                                  ^
```
Wie gehe ich jetzt damit lösungsorientiert um  ?


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> * Die "Familie" hat folgende private-Eigenschaften     #
> *  - "name" vom Typ String
> *  - "meldung" vom Typ Haus
> *  - "familienmitglieder" vom Typ Person-Array      *
> ...



Bedenke dabei, dass es zwei Variablen mit dem Namen "meldung" gibt! Eine Instanzvariable und einen Parameter. Bei einer muss man sich abmelden, bei der anderen anmelden.


----------



## mihe7 (10. Dez 2019)

@jono  Indem Du Dir die Klasse Haus und dort insbesondere die Signatur des Konstruktors ansiehst. Wenn man mal davon ausgeht, dass das Haus überall verwendet und erzeugt werden kann, müssen die Klasse und der Konstruktor public sein. Außerdem muss der zweite Parameter vom Typ Person sein.


----------



## Xknight (10. Dez 2019)

temi hat gesagt.:


> Bedenke dabei, dass es zwei Variablen mit dem Namen "meldung" gibt! Eine Instanzvariable und einen Parameter. Bei einer muss man sich abmelden, bei der anderen anmelden.


Na klar habe ich das berücksichtig und es in meiner Methode ummelden so umgesetzt.


----------



## kneitzel (10. Dez 2019)

Vermutlich ist der Konstruktor von Haus bei dir falsch, denn dein zweiter Parameter scheint vom Typ und zu sein und nicht von Person.


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Na klar ich das berücksichtig und es in meiner Methode ummelden so umgesetzt.



In der aus #210 ist das nicht der Fall.


----------



## 1337Avdu (10. Dez 2019)

XKnight ich glaube du brauchst ein bisschen schlaf, süßer


----------



## Xknight (10. Dez 2019)

temi hat gesagt.:


> In der aus #210 ist das nicht der Fall.


In der Aufgabe steht doch wenn anmelden und abmelden klappt soll true zurückgegeben werden und wenn z.b anmelden nicht klappt soll es rückgängig gemacht haben. Das habe ich doch so in meinen zwei if-Bedingungen umgesetzt oder nicht.


----------



## mihe7 (10. Dez 2019)

Nein. Du meldest Dich bei der selben "meldung" an und ab.


----------



## Xknight (10. Dez 2019)

Wie soll ich es sonst machen, dachte mir so geht es auch


----------



## mihe7 (10. Dez 2019)

Einmal die Instanzvariable meldung verwenden und einmal den Parameter meldung verwenden?


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Wie soll ich es sonst machen, dachte mir so geht es auch


Du musst dich bei this.meldung.abmelden() und bei meldung.anmelden().


----------



## Xknight (10. Dez 2019)

temi hat gesagt.:


> Du musst dich bei this.meldung.abmelden() und bei meldung.anmelden().


Das ist doch das selbe oder nicht?


----------



## temi (10. Dez 2019)

Xknight hat gesagt.:


> Das ist doch das selbe oder nicht?



Nein! Nein! Nein!

this.meldung ist die Instanzvariable
meldung ist der Parameter


----------



## mihe7 (10. Dez 2019)

Wenn Ihr weiter so planlos rumprobiert, wird es bald heißen: 

```
immatrikulationsamt.abmelden(jono);
immatrikulationsamt.abmelden(xknight);
```
SCNR.


----------



## temi (10. Dez 2019)

mihe7 hat gesagt.:


> Wenn Ihr weiter so planlos rumprobiert, wird es bald heißen:
> 
> ```
> immatrikulationsamt.abmelden(jono);
> ...



Was für ein fieser Spaß, aber lustig


----------



## 1337Avdu (10. Dez 2019)

hahaha ein witz unter informatiker sowas vesteht ihr nicht xknight && yono


----------



## jono (10. Dez 2019)

Konstruktoren sind bei mir public trotzdem funktioniert es nicht


----------



## mihe7 (10. Dez 2019)

temi hat gesagt.:


> Was für ein fieser Spaß, aber lustig


Ja, ich gebs zu. Wobei man davon ausgehen muss, dass das Immatrikulationsamt es richtig implementiert hat.


----------



## temi (10. Dez 2019)

Ich schau mir morgen früh an, wie es ausgegangen ist und geh jetzt ins Bett.

Gute Nacht allerseits!


----------



## jono (10. Dez 2019)

Gute Nacht !


----------



## mihe7 (10. Dez 2019)

temi hat gesagt.:


> Ich schau mir morgen früh an, wie es ausgegangen ist und geh jetzt ins Bett.


Das ist ja noch fieser  Gute Nacht.


----------



## mihe7 (10. Dez 2019)

jono hat gesagt.:


> Konstruktoren sind bei mir public trotzdem funktioniert es nicht


Nur weil ein Konstruktor public ist, heißt es ja nicht, dass alles richtig implementiert ist.


----------



## jono (10. Dez 2019)

```
public boolean ummelden(Haus meldung) {
		if(meldung.anmelden(this)&&meldung.abmelden(this)) {
			return true;
		}
		if(meldung.anmelden(this)==true && meldung.abmelden(this)==false) {
			meldung.abmelden(this);
		}
		return false;
	}
(/Code]

Wie meinst du das "Nein. Du meldest Dich bei der selben "meldung" an und ab."?
```


----------



## 1337Avdu (10. Dez 2019)

Bei der if verzweigung jono
Würde mal zwei seperate machen eins für anmelden und für abmelden


----------



## mihe7 (10. Dez 2019)

Du bekommst ein Haus als "meldung" übergeben. Und bei diesem(!) Haus meldest Du dich an (meldung.anmelden(this)) und wenn das funktioniert hat wieder ab (meldung.abmelden(this)). Das ist ja wohl nicht Sinn der Sache.


----------



## mihe7 (10. Dez 2019)

@1337Avdu wenn Du vor jono ein @ hinzufügst, dann wird er darüber benachrichtigt, dass er in einem Beitrag erwähnt wurde (so wie Du jetzt )


----------



## 1337Avdu (10. Dez 2019)

Jaa i know aber der chillt sowieso 24/7 im forum von daher ^^


----------



## jono (10. Dez 2019)

mit else Oder? @mihe7


----------



## mihe7 (10. Dez 2019)

Es geht jetzt noch nicht um das else sondern darum, dass Du Dich beim selben Haus ab- und wieder anmeldest: was soll das bringen?


----------



## mihe7 (10. Dez 2019)

Übrigens hat @temi in #227 bereits die Lösung dazu geschrieben.


----------



## jono (10. Dez 2019)

Du musst dich bei this.meldung.abmelden() und bei meldung.anmelden(). #227


----------



## mihe7 (10. Dez 2019)

Genau, verstehst Du den Unterschied?


----------



## jono (10. Dez 2019)

Ja, nur noch nicht wie ich dies in Code umsetzen soll. haha


----------



## mihe7 (11. Dez 2019)

OMG. Schreib mal zwei Zeilen, die das folgende machen:
1. melde die Familie beim alten Haus ab
2. melde die Familie beim neuen Haus an
(keine ifs, nur die Ab- und Anmeldung)


----------



## 1337Avdu (11. Dez 2019)

@jono das wird mir hier zu doof @mihe7 viel Spaß dir noch ich gehe schlafen wünsche dir ne angenehme nacht


----------



## mihe7 (11. Dez 2019)

@1337Avdu Danke, gleichfalls


----------



## jono (11. Dez 2019)

```
1.meldung.abmelden(this)
2.meldung.anmelden(this)
:D
```


----------



## jono (11. Dez 2019)

Wie mache ich den Unterschied zwischen alt und neu im Code manoman


----------



## mihe7 (11. Dez 2019)

Meintest Du nicht eben, dass Du den Unterschied verstehst?


----------



## mihe7 (11. Dez 2019)

Du hast ein Familien-Objekt. Dieses hat ein Attribut, das nennt sich meldung. In diesem Attribut ist das Haus gespeichert, bei dem die Familie aktuell gemeldet ist. Wie kannst Du auf dieses Attribut in jedem Fall (innerhalb einer Methode der Klasse Familie) zugreifen?


----------



## jono (11. Dez 2019)

```
Ja, so oder
public boolean ummelden(Haus meldung) {
		if(meldung.anmelden(this)&&this.meldung.abmelden(this)) {
			return true;
```


----------



## jono (11. Dez 2019)

???


----------



## jono (11. Dez 2019)

@mihe7 Bist du noch wach ?? ^^


----------



## mihe7 (11. Dez 2019)

Ja, jetzt mach aus #257 erstmal einen Zweizeiler ohne if.


----------



## jono (11. Dez 2019)

```
public boolean ummelden(Haus meldung) {
		meldung.anmelden(this)&&this.meldung.abmelden(this) return true;
```


----------



## mihe7 (11. Dez 2019)

Ach komm, das kann doch nicht so schwer sein:

```
meldung.anmelden(this);
    this.meldung.abmelden(this);
```

Nächste Baustelle: die Abmeldung soll nur dann ausgeführt werden, wenn die Anmeldung geklappt hat. Bitte umschreiben.


----------



## jono (11. Dez 2019)

Sorry du sagtest soll genau aus dem einen Zweizeiler machen  (Missverständnis)

```
if(meldung.anmelden(this==true){
this.meldung.abmelden(this) return true;
}
```


----------



## mihe7 (11. Dez 2019)

Formatier den Code vernünftig. Vergleiche mit true kannst Du Dir sparen.

```
if(meldung.anmelden(this)){
    this.meldung.abmelden(this);
    return true;
}
```
Und was musst Du zurückgeben, wenn die *An*meldung nicht geklappt hat?


----------



## jono (11. Dez 2019)

*if(Meldung.anmelden(this)==true


----------



## jono (11. Dez 2019)

Die Abmeldung muss zurückgegeben werden.


----------



## mihe7 (11. Dez 2019)

Sag mal, jetzt setze ich das ANmeldung extra fett und Du faselst was von Abmeldung. Was muss die Methode zurückgeben, wenn die ANNNNmeldung nicht geklappt hat?


----------



## mihe7 (11. Dez 2019)

BTW: es geht um das return...


----------



## jono (11. Dez 2019)

```
meldung.anmelden(this)
```
?


----------



## jono (11. Dez 2019)

return false;


----------



## jono (11. Dez 2019)

```
if(meldung.anmelden(this)==true && this.meldung.abmelden(this)==false) {
	this.meldung.abmelden(this);
}
return false;
```

Das müsste unter das hier:

```
if(meldung.anmelden(this)){
    this.meldung.abmelden(this);
    return true;
}
```
oder?


----------



## mihe7 (11. Dez 2019)

Jetzt lass endlich diese UND-Verknüpfüngen weg. Das return false hat halt gefehlt:

```
if(meldung.anmelden(this)){
    this.meldung.abmelden(this);
    return true;
}
return false;
```

D. h. wenn die Anmeldung nicht funktioniert, wird false zurückgegeben. 

Wenn die Anmeldung funktionierte, wird eine Abmeldung beim alten Haus versucht. Nächste Aufgabe: prüfe, ob die Abmeldung funktioniert.


----------



## jono (11. Dez 2019)

```
if(this.meldung.abmelden(this)==true){
meldung.anmelden(this)==true);
return true;
}
return false;
```


----------



## jono (11. Dez 2019)

Vergleiche kann man sich sparen


----------



## mihe7 (11. Dez 2019)

Wo ist das if? Und rück den Code endlich vernünftig ein.


----------



## jono (11. Dez 2019)

Das if ist doch da


----------



## mihe7 (11. Dez 2019)

Dein Code (mit Einrückungen):

```
if(this.meldung.abmelden(this)==true){
    meldung.anmelden(this)==true);
    return true;
}
return false;
```
Die zweite Zeile ist kein gültiger Code. Da fehlt ein if.


----------



## jono (11. Dez 2019)

Warum klappt das denn gerade nicht


----------



## jono (11. Dez 2019)

```
if(this.meldung.abmelden(this)==true){
   if( meldung.anmelden(this)==true);
    return true;
}
return false;
```


----------



## jono (11. Dez 2019)

Da steht unrechable Code


----------



## jono (11. Dez 2019)

```
public boolean ummelden(Haus meldung) {
		if (meldung.anmelden(this)) {
			this.meldung.abmelden(this);
			return true;
		}
		return false;
		
		if(this.meldung.abmelden(this)==true){  // -> rot angestrichen
		  if (meldung.anmelden(this)==true);
		    return true;
		}
		return false;
	
	}
```


----------



## jono (11. Dez 2019)

Und wenn ich die unterste Klammer entferne dann wird nur noch angezeigt complete Statement mit } aber sobald die klammer da ist wieder unrechable code


----------



## jono (11. Dez 2019)

Noch da ?


----------



## mihe7 (11. Dez 2019)

Ja, ich überlege nur gerade, wie ich Dich nicht in der Luft zerreiße.


----------



## mihe7 (11. Dez 2019)

Du solltest in #271 einfach nur ein if bzgl. der Abmeldung einfügen. Das kann doch nicht so schwer sein.


----------



## 687b46c0da97 (11. Dez 2019)

Nunja, du solltest nun folgenden Code haben:

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

Dieser, wie du hoffentlich verstanden hast, führt die Meldung an dem Haus an, welches als Parameter übergeben worden ist. Falls das Erfolgreich war, werden die Zeilen innerhalb der If-Abfrage ausgeführt. Falls die anmeldung nicht erfolgreich war, gibt deine Methode "false" zurück.

Innerhalb der If-abfrage, versucht du, eine abmeldung am aktuellen Haus auszuführen. Allerdings prüfst du nicht ob diese Erfolgreich war, sondern gibst immer true zurück.

Somit solltest du nun, wenn die anmeldung erfolgreich war, den Rückgabewert von .abmelden() prüfen.


```
public boolean ummelden(Haus meldung) {
    if(meldung.anmelden(this)){
        this.meldung.abmelden(this); //Hier den Rückgabewert prüfen
        return true;
    }
    return false;
}
```


(Sorry ich kanns mir nicht verkneifen ...  )


----------



## jono (11. Dez 2019)

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


----------



## jono (11. Dez 2019)

Ist echt nicht normal, aber bin seit 5 Uhr wach und bin total am Ar...


----------



## mihe7 (11. Dez 2019)

jono hat gesagt.:


> Ist echt nicht normal,


Das stimmt.

Du sollst einfach nur den Rückgabewert prüfen, ein einfaches if einfügen, mehr nicht:

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

Nach dem inneren if (EDIT: im Code mit /* hier */ markiert) machst Du jetzt noch die Anmeldung rückgängig, dann bist Du fertig.


----------



## 687b46c0da97 (11. Dez 2019)

Nun, aktuell hast du folgende Logik implementiert


```
Wenn (Am neuen Haus Anmelden) erfolgreich war
    Melde mich am aktuellen Haus ab
    Wenn (Melde mich am aktuellen Haus ab) erfolgreich war
        Melde mich am neuen Haus an
        Gebe "true" zurück
    Gebe "false" zurück
Gebe "false" zurück
```



```
Wenn (Am neuen Haus Anmelden) erfolgreich war
    Melde mich am aktuellen Haus ab
    Wenn (Melde mich am aktuellen Haus ab) erfolgreich war //Du meldest dich ein zweites mal ab. Braucht's das? Der alte Vermieter wird froh sein.
        Melde mich am neuen Haus an //Wieso meldest du dich nochmal an? Das machst du bereits in Zeile 1. Der Vermieter schüttelt nur mit dem kopf.
        Gebe "true" zurück
    Gebe "false" zurück //Das kannst du einfach weglassen, nachdem in der nächsten Zeile bereits false zurückgegben wird
Gebe "false" zurück
```


//Zuviele Köche machen die Suppe fett - ich halte mich raus


----------



## jono (11. Dez 2019)

@mihe Um es rückgängig zu machen, muss es ja return false zurückgeben nh?


----------



## mihe7 (11. Dez 2019)

687b46c0da97 hat gesagt.:


> ich halte mich raus


Bitte nicht, ich möchte jetzt dann gehen  



jono hat gesagt.:


> @mihe Um es rückgängig zu machen, muss es ja return false zurückgeben nh?


Du meldest Dich beim Studium an und wenn Du die Anmeldung rückgängig machen willst, sagst Du "false"?


----------



## jono (11. Dez 2019)

ne dann true


----------



## jono (11. Dez 2019)

Bin nicht mehr in der Lage was zu checken verzeih es mir würde gerne schlafen gehen aber muss die Aufgabe noch korrekt hinbekommen


----------



## jono (11. Dez 2019)

Ich bekomme trotzdem noch Fehlermeldungen...


----------



## mihe7 (11. Dez 2019)

An der Rückgabe (return) musst Du nichts ändern. Eine Anmeldung machst Du durch eine Abmeldung rückgängig. Unglaublich.


----------



## jono (11. Dez 2019)

Ja gut dann kommt das dahin

```
this.meldung.abmelden(this);
```


----------



## 687b46c0da97 (11. Dez 2019)

Damit meldest du dich am alten Haus ab. Du sollst aber die Anmeldung am neuen Haus Rückgängig machen.


----------



## mihe7 (11. Dez 2019)

Wenn die Abmeldung beim alten Haus nicht klappt, dann melde Dich beim alten Haus ab?


----------



## mihe7 (11. Dez 2019)

So, und ich gehe jetzt. Gute Nacht.


----------



## jono (11. Dez 2019)

Gute Nacht und vielen Dank für die Hilfe bzw Geduld.

```
meldung.abmelden(this);  // Dann so
```


----------



## jono (11. Dez 2019)

@687b46c0da97


----------



## 687b46c0da97 (11. Dez 2019)

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...)


----------



## jono (11. Dez 2019)

Okay, ja der Code funktioniert so, trotztdem schlägt der Autokorrektor noch fehl.


----------



## jono (11. Dez 2019)

```
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


----------



## jono (11. Dez 2019)

```
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.


----------



## 687b46c0da97 (11. Dez 2019)

Magst du bitte einmal den code der "Haus" & "PublicTests" klasse hier reinstellen, damit ich mir einen Überblick verschaffen kann?


----------



## jono (11. Dez 2019)

```
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]


----------



## jono (11. Dez 2019)

Hausklasse:

```
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;
	}

}
```


----------



## jono (11. Dez 2019)

Bewohner null bei Haus muss ja weg, habe ich vergessen


----------



## jono (11. Dez 2019)

ouhman kopiert natürlich direkt alles mit hahahaha


----------



## jono (11. Dez 2019)

Hast du dir einen Überblick verschafft?


----------



## 687b46c0da97 (11. Dez 2019)

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.


```
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.


----------



## jono (11. Dez 2019)

Okay, trotzdem vielen Dank .


----------



## 687b46c0da97 (11. Dez 2019)

```
* 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.):

```
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.


----------



## jono (11. Dez 2019)

```
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 !! (


----------



## jono (11. Dez 2019)

```
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


----------



## jono (11. Dez 2019)

Kann mir jemand helfen bei der Meldung ist nur noch 1 Fehler?

```
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

```
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


----------



## jono (11. Dez 2019)

bei der *Fehlermeldung ist nur noch 1 error


----------



## mihe7 (11. Dez 2019)

Vielleicht solltest Du beim an- und abmelden die Anzahl der Wohneinheiten anpassen?


----------



## jono (11. Dez 2019)

Wie meinst du?...


----------



## kneitzel (11. Dez 2019)

jono hat gesagt.:


> ```
> public boolean anmelden(Familie someFam) {
> for (int i = 0; i < bewohner.length-1; ++i) {
> for (int j = i+1; j < bewohner.length; ++j) {
> ...



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?


----------



## mihe7 (11. Dez 2019)

```
public int getAnzahlWohneinheiten() {
        return anzahlWohneinheiten;
    }
```
Die Variable wird beim An- und Abmelden nicht verändert.


----------



## kneitzel (11. Dez 2019)

mihe7 hat gesagt.:


> Vielleicht solltest Du beim an- und abmelden die Anzahl der Wohneinheiten anpassen?


Nein, denn die Wohneinheiten sind doch die Größe des Arrays und null ist die Kennzeichnung freier Plätze. Daher ist da nichts anzupassen....


----------



## jono (11. Dez 2019)

Indem ich schaue ob er schon vorhanden ist?


----------



## jono (11. Dez 2019)

der 50Euro Schein


----------



## kneitzel (11. Dez 2019)

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?


----------



## jono (11. Dez 2019)

Anstatt der doppelten Schleife dann eine for Schleife ?


----------



## kneitzel (11. Dez 2019)

Ja, das ist der erste Schritt. Was machst Du in der Schleife?


----------



## jono (11. Dez 2019)

```
for(i=0;i<bewohner.length;++i){
if(meldung.anmelden(this)=someFam){
return true;
}else{
meldung.anmelden(this)
}
}
}
```


----------



## jono (11. Dez 2019)

Sorry für die Nicht-Einrückung habe das schnell gemacht, da um 8 Uhr Deadline ist.


----------



## jono (11. Dez 2019)

```
i++*
```


----------



## jono (11. Dez 2019)

```
for(i=0;i<bewohner.length;++i){
if(bewohner[i]=someFam){
return true;
}
}
```


----------



## jono (11. Dez 2019)

Kannst du mir schnell bitte die Lösung sagen bzw. das was fehlt ^^?


----------



## kneitzel (11. Dez 2019)

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.


----------



## jono (11. Dez 2019)

```
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;

	}
```


----------



## kneitzel (11. Dez 2019)

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

Wir wollen natürlich vergleichen!


----------



## jono (11. Dez 2019)

```
* 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;
```


----------



## jono (11. Dez 2019)

Ist es jetzt korrekt so

```
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;

	}
```


----------



## jono (11. Dez 2019)

Sag mal bitte schnell was ist immer noch der Fehler


----------



## jono (11. Dez 2019)

Mit dem expected 2 but was 0


----------



## kneitzel (11. Dez 2019)

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.


----------



## jono (11. Dez 2019)

ein return false statt return true?


----------



## kneitzel (11. Dez 2019)

Kannst Du mir den Test, der fehlschlägt, genau zeigen mit markierter Zeile, welcher Assert fehlschlägt?


----------



## kneitzel (11. Dez 2019)

jono hat gesagt.:


> ```
> for(int i=0;i<bewohner.length;i++) {
> if(bewohner[i]==someFam) {
> return false; // Hier müsste nach Aufgabe ein false hin.
> ...


----------



## jono (11. Dez 2019)

klappt nicht


----------



## jono (11. Dez 2019)

```
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)
```


----------



## jono (11. Dez 2019)

Ja genau da habe ich auch ein false


----------



## kneitzel (11. Dez 2019)

Dann noch einmal die Datei PublicTests.java und markiere Zeile 22.


----------



## jono (11. Dez 2019)

```
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());
	}


}
```


----------



## jono (11. Dez 2019)

Z. 22 assertEquals(2, h.getAnzahlWohneinheiten());


----------



## kneitzel (11. Dez 2019)

Ok, hab es in den alten Threads auf Seite 16 gefunden:

    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());


Schau mal in den Konstruktor von Haus: Setzt du am Ende die Property anzahlWohneinheiten? Also sowas wie
`this.anzahlWohneinheiten = anzahlWohneinheiten;`
(anzahlWohneinheiten war der Parameter, der versteckt die Instanzvariable. Daher Zugriff auf Instanzvariable mit "this." davor.)


----------



## jono (11. Dez 2019)

Habs vergessen direkt zu markieren


----------



## jono (11. Dez 2019)

Ja habe ich


----------



## kneitzel (11. Dez 2019)

Zeig bitte einmal deinen Konstruktor vom Haus.


----------



## jono (11. Dez 2019)

his.bewohner = new Familie[anzahlWohneinheiten];
obwohl ne habe nur das hier


----------



## jono (11. Dez 2019)

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

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

	}
```


----------



## mihe7 (11. Dez 2019)

Und wo ist da this.anzahlWohneinheiten = anzahlWohneinheiten?


----------



## jono (11. Dez 2019)

Nicht dabei, da die Aufgabenstellung gesagt hatte man soll nur Besitzer und Adresse übernehmen?


----------



## mihe7 (11. Dez 2019)

Wenn Du in getAnzahlWohneinheiten die Variable returnst, dann solltest Du die Variable auch setzen.


----------



## kneitzel (11. Dez 2019)

Wenn es das Feld gibt, dann wird es auch gesetzt. Und der Test prüft es ab.

Was man maximal auch machen könnte, wäre:
- die Instanzvariable wird entfernt.
- die Methode getAnzahlWohneinheiten gibt bewohner.length zurück.

Edit: Muss natürlich bewohner familie sein und nicht person.


----------



## jono (11. Dez 2019)

Blöder Fehler.


----------



## jono (11. Dez 2019)

Okay , vielen Dank. Ist halt jetzt so  .


----------



## mihe7 (11. Dez 2019)

0 Punkte?


----------



## kneitzel (11. Dez 2019)

Läuft der Test jetzt durch und sind wir fertig geworden?


----------



## jono (11. Dez 2019)

0 Punkte nicht mindestens einer von drei


----------



## jono (11. Dez 2019)

Der Test ist ab 8 Uhr abgelaufen man kann nichts mehr hochladen bzw. Schauen ob der er fehlschlägt.


----------



## jono (11. Dez 2019)

Aber ja wir sind fertig geworden,  endlich, in der optimistischen Hoffnung gut daraus gelernt zu haben. Wie auch immer, auch wenn es einen Punkt gibt, dann heißt es beim nächsten Mal mehr anstrengen, wird wahrscheinlich eine Aufgabe kommen mit Vererbung polymorphic so etwas in der Art. Aufgabe müsste auch im Verlauf des Tages auf der Uni Homepage hochgeladen werden.


----------



## jono (11. Dez 2019)

Und eventuell auch hier haha


----------



## mihe7 (11. Dez 2019)

Läuft denn der Test bei Dir durch?


----------



## jono (11. Dez 2019)

Ja, durchlaufen tut er nur ist kein grünes Häkchen für absolute Korrektheit dahinter.


----------



## temi (11. Dez 2019)

Guten Morgen!

Alle schon wieder da?

Schade, dass es nicht geklappt hat, aber wird schon noch!

@jono und Konsorten, ich empfehle euch beim nächsten Mal dringend, weniger zu behaupten, dass ihr alles richtig gemacht habt (vor allem, wenn alle anderen euch erzählen, dass es nicht so ist) und stattdessen konkreter zu fragen, wenn ihr etwas nicht zu 100% verstanden habt. Das Verständnis ist hier das wichtigste und nachdem ich mir den Verlauf auf den letzten Seiten durchgelesen habe, fehlt es leider immer noch bei euch.

Insofern solltet ihr auch jetzt noch einmal in euch gehen und alles aus dem Code heraussuchen, was euch nicht vollständig einleuchtet und hier (oder auch woanders) nachfragen.

Viel Erfolg beim nächsten Mal.


----------

