UML Diagramm

Diskutiere UML Diagramm im Java Basics - Anfänger-Themen Bereich.
S

Snaer

Das ist ein Fehler, der anzeigt, dass ein Test fehlschlägt:


Der Test erwartet eine Person, es wird aber null geliefert. Dem Test nach soll beim Erzeugen eines Kunstwerks automatisch eine Person als Besitzer des Kunstwerks angelegt werden.
Okay da ich in der Klasse Person einen leeren Konstruktor habe nehme ich mal an, dass dort mit einem bestimmten Aufruf einen Besitzer setzen kann, liege ich da richtig?
Oder muss ich den Fehler in der Klasse Kunstwerk suchen, da ich dort ja auch die Variable Besitzer erstellt habe?
 
mihe7

mihe7

Dem Test nach soll beim Erzeugen eines Kunstwerks automatisch eine Person als Besitzer des Kunstwerks angelegt werden.
Das war eine falsche Annahme. Bei Euch wird ja alles mögliche über die Konstruktoren erledigt.

Okay da ich in der Klasse Person einen leeren Konstruktor habe nehme ich mal an, dass dort mit einem bestimmten Aufruf einen Besitzer setzen kann, liege ich da richtig?
Deine Klasse Person muss über einen Konstruktor verfügen, der als Parameter ein Kunstwerk erhält. In dem Konstruktor kannst Du dann die setBesitzer-Methode des übergebenen Kunstwerks verwenden.
 
S

Snaer

Okay also es tut mir wirklich sehr leid, dass ich vermutlich dezent anstrengend bin :rolleyes:
Code:
public Person(Kunstwerk kunstwerk) {
    kunstwerk.setBesitzer(this);
    }
Der Fehler ist damit behoben, jedoch entsteht noch eine NullPointerException
Code:
Person person1 = new Person(kunstwerk1);
        assertEquals(person1, kunstwerk1.getBesitzer());
        person1.setName("Person1");
        assertEquals("Person1",person1.getName());
        assertEquals(1,person1.getKunstwerke().size());
        assertTrue(person1.getKunstwerke().contains(kunstwerk1));
    }

}

java.lang.NullPointerException
    at PublicTests.test(PublicTests.java:44)
Liege ich richtig wenn ich sage, dass der Test prüft ob person1.getKunstwerke().size()); 1 ergibt und da dies allerdings bei mir 0 ergibt er mir stattdessen den Fehler ausspuckt?
 
mihe7

mihe7

Liege ich richtig wenn ich sage, dass der Test prüft ob person1.getKunstwerke().size()); 1 ergibt und da dies allerdings bei mir 0 ergibt er mir stattdessen den Fehler ausspuckt?
Wenn Zeile 44 die Zeile
Code:
assertTrue(person1.getKunstwerke().contains(kunstwerk1));
ist, dann bedeutet die NullPointerException (NPE), dass person1.getKunstwerke() null liefert.
 
J

JustNobody

Der Fehler ist damit behoben, jedoch entsteht noch eine NullPointerException
Code:
Person person1 = new Person(kunstwerk1);
        assertEquals(person1, kunstwerk1.getBesitzer());
        person1.setName("Person1");
        assertEquals("Person1",person1.getName());
        assertEquals(1,person1.getKunstwerke().size());
        assertTrue(person1.getKunstwerke().contains(kunstwerk1));
    }

}

java.lang.NullPointerException
    at PublicTests.test(PublicTests.java:44)
Liege ich richtig wenn ich sage, dass der Test prüft ob person1.getKunstwerke().size()); 1 ergibt und da dies allerdings bei mir 0 ergibt er mir stattdessen den Fehler ausspuckt?
Also eine NullPointerException ist doch deutlich von einem "expected: 1 but was 0" zu unterscheiden.
Wenn Du eine NPE bekommst, dann liegt es nicht daran, dass etwas 0 war wo er 1 erwartet hätte.

Da wir nicht sehen können, was Zeile 44 ist, können wir nur bedingt etwas aussagen. Deine Aussage scheint auf die Zeile
assertEquals(1,person1.getKunstwerke().size());
hin zu deuten. Also vermutlich liefert getKunstwerke() einfach nur null, weil die entsprechende Instanzvariable hinter dem Getter nicht initialisiert wurde. Also erst einmal im Konstruktor auch diese Instanzvariable initialisieren.
Danach wird es aber wohl zu einem "expected 1 but was 0" kommen, denn Du wirst im Konstruktor von Person nicht die Person als Besitzer hinterlegen.
 
L

Luca H

Danach wird es aber wohl zu einem "expected 1 but was 0" kommen, denn Du wirst im Konstruktor von Person nicht die Person als Besitzer hinterlegen.
Weswegen wird die Person nicht als Besitzer hinterlegt, wird das nicht durch den Methodenaufruf erledigt?
Code:
public Person(Kunstwerk kunstwerk) {
    kunstwerk.setBesitzer(this);
    }
 
mihe7

mihe7

Weswegen wird die Person nicht als Besitzer hinterlegt, wird das nicht durch den Methodenaufruf erledigt?
Die Beziehung ist bidirektional, die auf zwei Einzelbeziehungen abgebildet wird: ein Kunstwerk kann eine Person (als Besitzer) haben und eine Person kann beliebig viele Kunstwerke besitzen.

Die "Kunstwerk-hat-Besitzer"-Beziehung wird in Deinem Konstruktor gesetzt, nicht aber die Beziehung "Besitzer-besitzt-Kunstwerke".
 
L

Luca H

Die "Kunstwerk-hat-Besitzer"-Beziehung wird in Deinem Konstruktor gesetzt, nicht aber die Beziehung "Besitzer-besitzt-Kunstwerke".
[/QUOTE]

Also muss ich im Prinzip einen neuen Konstruktor, in der Klasse Peron initialisieren, der die "Besitzer-besitzt-Kunstwerk" Beziehung beschreibt oder stehe ich grade auf dem Schlauch? :D
 
S

Snaer

Muss es nicht eher dann einen Methoden Aufruf sein, bei der Kunstwerke Liste, die auf die setBesitzer Methode in der Klasse Kunstwerk verweist? Sprich ähnlich wie bei den Besitzer Verweis
 
L

Luca H

Müsste nicht die private ArrayList in Person so lauten
Code:
private ArrayList<Kunstwerk> kunstwerke = new ArrayList<Person>();
public Person(ArrayList<Kunstwerk> kunstwerke)
{
    this.kunstwerke  = kunstwerke;
}
,weil das ja eine 1..* Multiplizität ist? Jedoch wenn ich das so mache bekomme ich einen Compiler Fehler.
 
X

Xyz1

Ich denke @mihe7 meint es so:
Java:
import java.util.LinkedList;
import java.util.List;

public class Atelier {
	public static void main(String[] args) {
		Person p1 = new Person("Hubert");
		Person p2 = new Person("Staller");
		p1.addArt("picasso");
		p1.addArt("lump");
		p2.addArt("rubens");

		System.out.println(p1);
		System.out.println(p2);
	}
}

/**
 * Hat Aggregation zu Kunstwerken.
 */
class Person {
	String v_name;
	List<Kunstwerk> v_arts = new LinkedList<>();

	public Person(String p_name) {
		if (p_name == null)
			throw new RuntimeException();
		v_name = p_name;
	}

	public void addArt(String p_name) {
		if (p_name == null)
			throw new RuntimeException();
		v_arts.add(new Kunstwerk(p_name, this));
	}

	@Override
	public String toString() {
		return String.format("Person [v_name=%s, v_arts=%s]", v_name, v_arts);
	}
}

/**
 * Hat Komposition zu Person.
 */
class Kunstwerk {
	String v_name;
	Person v_owner;

	public Kunstwerk(String p_name, Person p_owner) {
		if (p_name == null || p_owner == null)
			throw new RuntimeException();
		v_name = p_name;
		v_owner = p_owner;
	}
}
 
L

Luca H

Mein Code für Person sieht gerade so aus :
Code:
import java.util.ArrayList;

public class Person {
    public Person(Kunstwerk person) {
        person.setBesitzer(this);
    }

    private String name;

    private ArrayList<Kunstwerk> kunstwerke = new ArrayList<Kunstwerk>();

    public ArrayList<Kunstwerk> getKunstwerke() {
        return kunstwerke;
    }

    public void setkunstwerke(ArrayList<Kunstwerk> kunstwerke) {
        this.kunstwerke = kunstwerke;
    }

    public String getName() {
        return name;
    }

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

}
Wie weiter oben schon gesagt habe ich nun einen
Code:
java.lang.AssertionError: expected:<1> but was:<0>
Bei einer 1..* Multiplizität müsste die private ArrayList wie folgt aussehen oder

Code:
private ArrayList<Kunstwerk> kunstwerke = new ArrayList<Person>();
public Person(ArrayList<Kunstwerk> kunstwerke)
{
    this.kunstwerke  = kunstwerke;
}
Jedoch kommt da ein Compiler Fehler...
 
J

JustNobody

Also einmal stark gekürzt:
Mein Code für Person sieht gerade so aus :
Code:
import java.util.ArrayList;

public class Person {
    public Person(Kunstwerk person) {
        person.setBesitzer(this);
    }

    private ArrayList<Kunstwerk> kunstwerke = new ArrayList<Kunstwerk>();
}
a) Es wird ein Kunstwerk in einem Parameter "person" übergeben? Also da wundere ich mich wirklich nicht, dass man Probleme hat noch etwas zu verstehen! Da es ein Kunstwerk ist und keine Person nennen wir es doch einfach einmal "kunstwerk":

Code:
import java.util.ArrayList;

public class Person {
    public Person(Kunstwerk kunstwerk) {
        kunstwerk.setBesitzer(this);
    }

    private ArrayList<Kunstwerk> kunstwerke = new ArrayList<Kunstwerk>();
}
Nun ist die Person im Kunstwerk korrekt angelegt worden. Aber das Array "kunstwerke" ist noch immer eine Leere ArrayList.

Was könntest Du denn nun noch machen, damit das übergebene Kunstwerk auch in der Liste der Kunstwerke enthalten ist?
 
L

Luca H

Was könntest Du denn nun noch machen, damit das übergebene Kunstwerk auch in der Liste der Kunstwerke enthalten ist?
[/QUOTE]

Achsooo, ja okay dann kann ich per :

Code:
kunstwerke.add(kunstwerk);
das Kunstwerk in die Liste einfügen
 
X

Xyz1

Alternativ empfiehlt sich auch das Builder Pattern oder Abstract Factory Pattern...
 
X

Xyz1

Schockierend musste ich gerade feststellen dass ein Atelier eine Kunstwerkstatt beschreibt... :eek: Der richtige Klassenname oben wäre also zum Bleistift Museum oder Bildersammlung.
 
Thema: 

UML Diagramm

Passende Stellenanzeigen aus deiner Region:
Anzeige

Anzeige

Anzeige
Oben