# Objekt aus String-Array erzeugen



## Prokyon114 (19. Jun 2019)

Hallo,

ich sitze gerade an einer Aufgabe und hänge an einer bestimmten Stelle. Folgende Aufforderung ist gegeben:



> Schreiben Sie eine Klasse FormenTest und darin eine statische Methode
> public static GeometrischeForm erzeuge(String[] array),
> die als Argument einen Array von Strings übergeben bekommt. Das erste Element dieses Arrays soll den Objekttyp spezifizieren (also "Dreieck", "Kreis","Rechteckt","Quadrat"). Die nachfolgen- den Elemente sind die Werte, die das geometrische Objekt definieren; so kann das Array z. B. aussehen:{"Dreieck", "3.0", "4.0", "5.0"}.
> Die Methode soll ein Objekt entsprechenden Typs mit den Parametern konstruieren und zurückgeben. Die Methode Double.parseDouble wird euch dabei helfen. Sind zu wenige Parameter übergeben oder ein unbekannter Objekttyp gegeben, soll null zurückgegeben werden. Implementieren Sie dies, indem Sie die IndexOutOfBoundsException abfangen, wenn die Methode versucht, auf ein nicht vorhandenes Element des übergebenen String-Arrays zuzugreifen.



Habe folgendes Gerüst:


```
public class FormenTest{
    public static GeometrischeForm erzeuge(String[] array){
        GeometrischeForm[] name = new GeometrischeForm(umfang, flaecheninhalt);
    }
}
```

Jedoch weiß ich gerade nicht, wie ich es hinbekomme, dass die Variablen des String-Arrays an den richtigen Stellen eingefügt werden und dadurch die richtigen Objekte erzeugt werden (jedes Objekt hat eine eigene Klasse, wobei Attribute vererbt werden).

Ich freue mich auf Hinweise.

LG


----------



## Prokyon114 (19. Jun 2019)

Hier noch das UML-Diagramm:


----------



## mrBrown (19. Jun 2019)

Prokyon114 hat gesagt.:


> Habe folgendes Gerüst:


Ist das Gerüst von dir oder gegeben? Falls ersteres, schmeiß es weg, dass geht am verlangten vorbei 



Prokyon114 hat gesagt.:


> Jedoch weiß ich gerade nicht, wie ich es hinbekomme, dass die Variablen des String-Arrays an den richtigen Stellen eingefügt werden und dadurch die richtigen Objekte erzeugt werden (jedes Objekt hat eine eigene Klasse, wobei Attribute vererbt werden).



Welchen Code würdest du denn schreiben, wenn ich dir sagt, dass es ein Dreieck mit den Werten 3.0, 4.0, 5.0 sein soll?
Ganz unabhängig von irgendeinem String-Array und anderen Formen.


----------



## Prokyon114 (19. Jun 2019)

Hi, habe mein Gerüst über Bord geworfen. Habe nun folgendes (Code noch nicht vollständig):


```
public class FormenTest{

    public static GeometrischeForm erzeuge(String[] array){
        String objektName = array[0];
        double a = Double.parseDouble(array[1]);
        double b = Double.parseDouble(array[2]);
        double c = Double.parseDouble(array[3]);

        if(objektName = "Kreis"){
            
        }
        else if(objektName = "Quadrat"){

        }
        else if(objektName = "Rechteck"){

        }
        else if(objektName = "Dreieck"){

        }
        else{
            return null;
        }
    }
```

Bezüglich des Dreiecks habe ich folgenden Code:


```
public class Dreieck extends Rechteck{

    private double c;

    public double getC(){
        return c;
    }
    public void setC(double c){
        if(c < 0){
            c = -c;
        }
        this.c = c;
    }
    Dreieck(double umfang, double flaecheninhalt, double a, double b, double c){
        super(umfang, flaecheninhalt, a, b);
        this.c = c;
    }

    public String geoText(){
        return "Es handelt sich um ein Dreieck mit den Seitenlaengen "+getA()+", "+getB()+" und "+getC()+".";
    }

    public double berechneUmfang(){
        double umfang = getA()+getB()+getC();
        return umfang;
    }
    public double berechneFlaecheninhalt(){
        double s = 0.5*(getA()+getB()+getC());
        double flaecheninhalt = Math.sqrt(s*(s-getA())*(s-getB())*(s-getC()));
        return flaecheninhalt;
    }
}
```

LG


----------



## Prokyon114 (19. Jun 2019)

mrBrown hat gesagt.:


> Welchen Code würdest du denn schreiben, wenn ich dir sagt, dass es ein Dreieck mit den Werten 3.0, 4.0, 5.0 sein soll?
> Ganz unabhängig von irgendeinem String-Array und anderen Formen.




```
Dreieck dreieck = new Dreieck(3.0, 4.0, 5.0);
```


----------



## mihe7 (19. Jun 2019)

Prokyon114 hat gesagt.:


> public class Dreieck extends Rechteck{


Seit wann ist ein Dreieck ein Rechteck?


----------



## Prokyon114 (19. Jun 2019)

mihe7 hat gesagt.:


> Seit wann ist ein Dreieck ein Rechteck?



Das nicht, aber ein Rechteck hat die Seiten a und b, das Dreieck erbt a und b und hat zusätzlich noch das Attribut Seite c


----------



## mihe7 (19. Jun 2019)

Ist das vorgegeben oder von Dir?


----------



## Prokyon114 (19. Jun 2019)

Wir sollten und überlegen, wie wir am besten die Vererbung nutzen konnten und ich habe mir dann Gedanken gemacht (s. UML-Diagramm oben)


----------



## mihe7 (19. Jun 2019)

OK, das ist aber die denkbar schlechteste Art, Vererbung zu nutzen. Ein Auto hat zwei Reifen mehr als ein Fahrrad, deswegen ist das Auto noch lange kein Fahrrad. Mit Vererbung werden "is-a"-Beziehungen umgesetzt, nicht "has-a".


----------



## mrBrown (19. Jun 2019)

mihe7 hat gesagt.:


> Ein Auto hat zwei Reifen mehr als ein Fahrrad, deswegen ist das Auto noch lange kein Fahrrad.


Das liegt nur daran, dass es in Java keine Mehrfachvererbung gibt. Sonst wäre ein Auto einfach zwei Fahrräder und hätte damit 4 Reifen.


----------



## mrBrown (19. Jun 2019)

Prokyon114 hat gesagt.:


> ```
> Dreieck dreieck = new Dreieck(3.0, 4.0, 5.0);
> ```


Und wenn die Zahlen Strings wären?


----------



## Prokyon114 (19. Jun 2019)

mihe7 hat gesagt.:


> OK, das ist aber die denkbar schlechteste Art, Vererbung zu nutzen. Ein Auto hat zwei Reifen mehr als ein Fahrrad, deswegen ist das Auto noch lange kein Fahrrad. Mit Vererbung werden "is-a"-Beziehungen umgesetzt, nicht "has-a".



Da gebe ich dir Recht, jedoch denke ich, dass es in der Aufgabe leider so gefordert wird.


----------



## mrBrown (19. Jun 2019)

Prokyon114 hat gesagt.:


> Da gebe ich dir Recht, jedoch denke ich, dass es in der Aufgabe leider so gefordert wird.


Wenn du dir überlegen sollst, wie man Vererbung am besten nutzt, und du nimmst dann die schlechteste Variante, würde ich das nicht als im Sinne der Aufgabe ansehen...

(Allerdings ist die Aufgabe mit der Formulierung auch nicht gut gestellt...)


----------



## mihe7 (19. Jun 2019)

Prokyon114 hat gesagt.:


> Da gebe ich dir Recht, jedoch denke ich, dass es in der Aufgabe leider so gefordert wird.


Das musst Du wissen.


----------



## Prokyon114 (19. Jun 2019)

mrBrown hat gesagt.:


> Und wenn die Zahlen Strings wären?




```
Dreieck dreieck = new Dreieck(double.parseDouble(3.0), double.parseDouble(4.0), double.parseDouble(5.0));
```


----------



## mrBrown (19. Jun 2019)

Prokyon114 hat gesagt.:


> ```
> Dreieck dreieck = new Dreieck(double.parseDouble(3.0), double.parseDouble(4.0), double.parseDouble(5.0));
> ```


Mal getesteten, ob das kompiliert?


Und wenn die Werte jetzt in Variablen gespeichert sind?


----------



## mihe7 (19. Jun 2019)

Und warum hat Dein Konstruktor Parameter für Umfang und Fläche?!?

Oops, sorry @mrBrown


----------



## Prokyon114 (19. Jun 2019)

mrBrown hat gesagt.:


> Mal getesteten, ob das kompiliert?
> 
> 
> Und wenn die Werte jetzt in Variablen gespeichert sind?




```
public class FormenTest{

    public static GeometrischeForm erzeuge(String[] array){
        String objektName = array[0];
        double stringA = Double.parseDouble(array[1]);
        double stringB = Double.parseDouble(array[2]);
        double stringC = Double.parseDouble(array[3]);

        if(objektName == "Kreis"){
            Kreis kreis = new Kreis(stringA);
        }
        else if(objektName == "Quadrat"){
            Quadrat quadrat = new Quadrat(stringA);
        }
        else if(objektName == "Rechteck"){
            Rechteck rechteck = new Rechteck(stringA, stringB);
        }
        else if(objektName == "Dreieck"){
            Dreieck dreieck = new Dreieck(stringA, stringB, stringC);
        }
        else{
            return null;
        }
        return GeometrischeForm;
    }
    public static void main(String[] args){
        String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
        String[] array1 = {"Quadrat", "3.0"};
        String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
        String[] array3 = {"Dreieck", "3.0", "4.0"};

        erzeuge(array0);
        erzeuge(array1);
        erzeuge(array2);
        erzeuge(array3);
    }
}
```

Leider kompiliert es nicht wegen zahlreicher anderer Fehler.


----------



## Prokyon114 (19. Jun 2019)

mihe7 hat gesagt.:


> Und warum hat Dein Konstruktor Parameter für Umfang und Fläche?!?


Habe ich mittlerweile rausgenommen


----------



## mihe7 (19. Jun 2019)

```
double stringA = Double.parseDouble(array[1]);
```
Hältst Du es wirklich für sinnvoll, einer Variablen vom Typ double den Namen stringA zu geben?



Prokyon114 hat gesagt.:


> Leider kompiliert es nicht wegen zahlreicher anderer Fehler.


Ja, schau Dir mal an, was Dein return enthält.


----------



## mrBrown (19. Jun 2019)

Prokyon114 hat gesagt.:


> Leider kompiliert es nicht wegen zahlreicher anderer Fehler.


Und das wird auch zur Laufzeit noch Fehler werfen.

Deshalb besser einen Schritt nach dem anderen und nicht alle auf einmal...


----------



## Prokyon114 (19. Jun 2019)

mihe7 hat gesagt.:


> Hältst Du es wirklich für sinnvoll, einer Variablen vom Typ double den Namen stringA zu geben?



Nein, da hast du Recht.




mrBrown hat gesagt.:


> Und das wird auch zur Laufzeit noch Fehler werfen.
> 
> Deshalb besser einen Schritt nach dem anderen und nicht alle auf einmal...



Leider (oder zum Glück) wurde die Chronologie in der Aufgabenstellung vorgegeben:
Erst die Klassen erstellen, dann die Klassen füllen, und dann die Testklasse schreiben.


----------



## Prokyon114 (19. Jun 2019)

Ich weiß einfach nicht wie ich es hinbekomme, dass die erzeugten Objekte aus der erzeuge() Methode zurückgegeben werden. Mein Entwurf sieht nun so aus:



```
public class FormenTest{

    public static GeometrischeForm erzeuge(String[] array){
        String objektName = array[0];
        double array1 = Double.parseDouble(array[1]);
        double array2 = Double.parseDouble(array[2]);
        double array3 = Double.parseDouble(array[3]);

        if(objektName == "Kreis"){
            Kreis form = new Kreis(array1);
        }
        else if(objektName == "Quadrat"){
            Quadrat form = new Quadrat(array1);
        }
        else if(objektName == "Rechteck"){
            Rechteck form = new Rechteck(array1, array2);
        }
        else if(objektName == "Dreieck"){
            Dreieck form = new Dreieck(array1, array2, array3);
        }
        else{
            return null;
        }
        if(form == null){
            System.out.println("Ungueltige Eingabe!");
        }
        return form;
    }
    public static void main(String[] args){
        String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
        String[] array1 = {"Quadrat", "3.0"};
        String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
        String[] array3 = {"Dreieck", "3.0", "4.0"};

        erzeuge(array0);
        erzeuge(array1);
        erzeuge(array2);
        erzeuge(array3);
    }
}
```


Der Compiler sagt, dass er "form" nicht finden kann. Doch wie soll ich das Objekt deklarieren, zumal es viele verschiedene Formen annehmen kann?


----------



## mrBrown (19. Jun 2019)

Prokyon114 hat gesagt.:


> Leider (oder zum Glück) wurde die Chronologie in der Aufgabenstellung vorgegeben:
> Erst die Klassen erstellen, dann die Klassen füllen, und dann die Testklasse schreiben.


Bedeutet nicht, das man zwischendurch niemals prüfen darf, ob's kompiliert.


----------



## mrBrown (19. Jun 2019)

Prokyon114 hat gesagt.:


> Doch wie soll ich das Objekt deklarieren, zumal es viele verschiedene Formen annehmen kann?


Gibt es ganz vielleicht sowas wie einen Supertyp, den alle geometrischen Formen gemeinsam haben...?


----------



## Prokyon114 (19. Jun 2019)

mrBrown hat gesagt.:


> Gibt es ganz vielleicht sowas wie einen Supertyp, den alle geometrischen Formen gemeinsam haben...?



Naja die höchste Klasse (außer natürlich object) ist GeometrischeForm, doch der Konstruktor ist leer


----------



## mrBrown (19. Jun 2019)

Und braucht man zum deklarieren einer Variable deren Konstruktor?


----------



## Prokyon114 (19. Jun 2019)

mrBrown hat gesagt.:


> Und braucht man zum deklarieren einer Variable deren Konstruktor?




```
public class FormenTest{

    public static GeometrischeForm erzeuge(String[] array){
        String objektName = array[0];
        double array1 = Double.parseDouble(array[1]);
        double array2 = Double.parseDouble(array[2]);
        double array3 = Double.parseDouble(array[3]);

        GeometrischeForm form = new GeometrischeForm();
        
        if(objektName == "Kreis"){
            Kreis form = new Kreis(array1);
        }
        else if(objektName == "Quadrat"){
            Quadrat form = new Quadrat(array1);
        }
        else if(objektName == "Rechteck"){
            Rechteck form = new Rechteck(array1, array2);
        }
        else if(objektName == "Dreieck"){
            Dreieck form = new Dreieck(array1, array2, array3);
        }
        else{
            return null;
        }
        if(form == null){
            System.out.println("Ungueltige Eingabe!");
        }
        return form;
    }
```

?


----------



## kneitzel (19. Jun 2019)

Musst du denn der GeometrischenForm form gleich eine neue Instanz zuweisen oder ginge es auch anders?

Und wenn du GeometrischeForm form als Variable hast: warum nutzt du diese nicht einfach in dem folgenden Code?


----------



## Prokyon114 (19. Jun 2019)

kneitzel hat gesagt.:


> Musst du denn der GeometrischenForm form gleich eine neue Instanz zuweisen oder ginge es auch anders?
> 
> Und wenn du GeometrischeForm form als Variable hast: warum nutzt du diese nicht einfach in dem folgenden Code?



Nein, ich muss sie nicht unbedingt nutzen, und wenn ich sie im folgenden Code nutze, dann sagt der Compiler variable form is already defined


----------



## kneitzel (19. Jun 2019)

Die Fehlermeldung besagt, dass du eine Variable form erneut deklarieren willst, obwohl sie schon deklariert ist ... Also keine neue Variable deklarieren sondern die vorhandene nutzen ...


----------



## Prokyon114 (19. Jun 2019)

kneitzel hat gesagt.:


> Die Fehlermeldung besagt, dass du eine Variable form erneut deklarieren willst, obwohl sie schon deklariert ist ... Also keine neue Variable deklarieren sondern die vorhandene nutzen ...



Hm, aber wie genau soll ich das anstellen? Ich habe ja je nachdem, welche Eingabe getätigt wird, unterschiedliche Objekte. Also kann ich doch am Anfang nicht einfach ein Objekt erstellen und es dann mit den if else Schleifen nochmal ändern, oder?
Dann würde doch wahrscheinlich auch das Objekt, das zurückgegeben werden soll, unterschiedlich sein?


----------



## mihe7 (19. Jun 2019)

Prokyon114 hat gesagt.:


> Also kann ich doch am Anfang nicht einfach ein Objekt erstellen


Deklarieren würde reichen.


----------



## Prokyon114 (19. Jun 2019)

mihe7 hat gesagt.:


> Deklarieren würde reichen.



also einfach

GeometrischeForm form;

oder wie?


----------



## mihe7 (19. Jun 2019)

Ja, und in Deinen ifs weist Du jetzt einfach die neuen Objekte dieser Variablen zu (ohne neue Deklaration). Das geht aufgrund der "is-a"-Beziehung (Kreis is-a GeometrischeForm, also kann einer Variable vom Typ GeometrischeForm eine Referenz auf ein Kreis-Objekt zugewiesen werden)


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> also einfach
> 
> GeometrischeForm form;
> 
> oder wie?


----------



## Prokyon114 (19. Jun 2019)

Super, es kompiliert, vielen Dank  Beim ausführen kommt aber folgendes:

Exception in thread "main" java.lang.IllegalAccessError: class FormenTest tried to access method Dreieck.<init>(DDD)V (FormenTest is in unnamed m
odule of loader com.sun.tools.javac.launcher.Main$MemoryClassLoader @6d3af739; Dreieck is in unnamed module of loader 'app')
        at FormenTest.erzeuge(FormenTest.java:21)
        at FormenTest.main(FormenTest.java:34)


----------



## Prokyon114 (19. Jun 2019)

Prokyon114 hat gesagt.:


> Super, es kompiliert, vielen Dank  Beim ausführen kommt aber folgendes:
> 
> Exception in thread "main" java.lang.IllegalAccessError: class FormenTest tried to access method Dreieck.<init>(DDD)V (FormenTest is in unnamed m
> odule of loader com.sun.tools.javac.launcher.Main$MemoryClassLoader @6d3af739; Dreieck is in unnamed module of loader 'app')
> ...



Ok, wird wohl daran liegen, dass es nicht public ist... *schäm*


----------



## Prokyon114 (19. Jun 2019)

Nun soll ich noch die IndexOutOfBoundsException abfange. Ich habe das folgendermaßen gelöst, allerdings ist jetzt bei return form die Variable angeblich nicht mehr initialisiert?? Das macht mich gerade verrückt.


```
public class FormenTest{

    public static GeometrischeForm erzeuge(String[] array){
        String objektName = array[0];
        double array1 = Double.parseDouble(array[1]);
        double array2 = Double.parseDouble(array[2]);
        double array3 = Double.parseDouble(array[3]);

        GeometrischeForm form;
        
        if(objektName == "Kreis"){
            try{
                form = new Kreis(array1);
            }
            catch(IndexOutOfBoundsException e1){
                System.out.println("Fehler");
            }
        }
        else if(objektName == "Quadrat"){
            try{
            form = new Quadrat(array1);
            }
            catch(IndexOutOfBoundsException e1){
                System.out.println("Fehler");
            }
        }
        else if(objektName == "Rechteck"){
            try{
            form = new Rechteck(array1, array2);
            }
            catch(IndexOutOfBoundsException e1){
                System.out.println("Fehler");
            }
        }
        else if(objektName == "Dreieck"){
            try{
            form = new Dreieck(array1, array2, array3);
            }
            catch(IndexOutOfBoundsException e1){
                System.out.println("Fehler");
            }
        }
        else{
            return null;
        }
        return form;
    }
```


----------



## temi (19. Jun 2019)

Ähm, ich glaube es geht um das übergebene Array...

Hast du deine main() von weiter oben schon mal so ausprobiert?

Was könnte passieren, wenn du `Double.parseDouble(array[3]);` versuchst auszuführen und das übergebene Array nur zwei Elemente hat?


----------



## Prokyon114 (19. Jun 2019)

Ja, habe ich, dabei kam allerdings immer eine IndexOutOfBoundsException, die ich laut Aufgabenstellung abfangen soll und jetzt lässt sich wegen des Fehlers das Programm nicht mehr kompilieren


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> dabei kam allerdings immer eine IndexOutOfBoundsException





temi hat gesagt.:


> Was könnte passieren, wenn du `Double.parseDouble(array[3]);` versuchst auszuführen und das übergebene Array nur zwei Elemente hat?


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> jetzt lässt sich sich wegen des Fehlers nicht mehr kompilieren



Entferne alle try..catch-Blöcke erst mal wieder. Die stimmen so nicht.


----------



## Prokyon114 (19. Jun 2019)

Also muss ich das IndexOutOfBoundsException schon oben abfangen?


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> Also muss ich das IndexOutOfBoundsException schon oben abfangen?



Wo glaubst du wird die Ausnahme ausgelöst?

Das sollte deine IDE dir in der Fehlermeldung auch anzeigen.

Was bedeutet die Ausnahme überhaupt?


----------



## mihe7 (19. Jun 2019)

Prokyon114 hat gesagt.:


> Nun soll ich noch die IndexOutOfBoundsException abfange.


An welcher Stelle kann diese denn auftreten?

EDIT: zu spät


----------



## Prokyon114 (19. Jun 2019)

temi hat gesagt.:


> Wo glaubst du wird die Ausnahme ausgelöst?
> 
> Das sollte deine IDE dir in der Fehlermeldung auch anzeigen.
> 
> Was bedeutet die Ausnahme überhaupt?



Hm, die Ausnahme wird zuerst in Zeile 35 ausgelöst, also wenn ich {"Quadrat", "3.0"} erstellen will und nochmal in Zeile 6. Es heißt denke ich, dass das Array nicht vollständig gefüllt ist.


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> Es heißt denke ich, dass das Array nicht vollständig gefüllt ist.



Naja, etwas eigenwillige Ausdrucksweise, die ungefähr auf das hinausläuft, was es wirklich bedeutet 

IndexOutOfBounds bedeutet, dass du auf ein Arrayelement zugreifen möchtest, dass es nicht gibt. Und jetzt ließ noch mal aufmerksam Beitrag #41


----------



## Prokyon114 (19. Jun 2019)

temi hat gesagt.:


> Ähm, ich glaube es geht um das übergebene Array...
> 
> Hast du deine main() von weiter oben schon mal so ausprobiert?
> 
> Was könnte passieren, wenn du `Double.parseDouble(array[3]);` versuchst auszuführen und das übergebene Array nur zwei Elemente hat?



Dann versucht das Programm wohl auf Position 3 zuzugreifen, die nicht existiert und dadurch entsteht der Fehler


----------



## mihe7 (19. Jun 2019)

Richtig und daher kann die Exception nur dort auftreten, wo auf ein array-Element zugegriffen wird.


----------



## Prokyon114 (19. Jun 2019)

Okay, doch womit kann ich das Programm diesen Fehler abfangen lassen?


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> Okay, doch womit kann ich das Programm diesen Fehler abfangen lassen?



try...catch ?


----------



## Prokyon114 (19. Jun 2019)

temi hat gesagt.:


> try...catch ?



Wenn ich die try catch Methode einbaue kann der compiler die variablen array 1 2 3 nicht mehr finden :/


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> Wenn ich die try catch Methode einbaue kann der compiler die variablen array 1 2 3 nicht mehr finden :/



Variablen, die innerhalb des try-Blockes deklariert werden, verlieren am Ende des Blockes ihre Gültigkeit. Deklariere die Variable doch einfach vorher.


----------



## mihe7 (19. Jun 2019)

Hatten wir in dem Thread nicht schon einmal Deklaration und Zuweisung?


----------



## kneitzel (19. Jun 2019)

Meinen Beitrag gelöscht. Hatte auf einen Beitrag geantwortet und auf dem Handy nicht gesehen, dass es ja schon viel mehr gab ...


----------



## Prokyon114 (19. Jun 2019)

Jetzt beschwert der Compiler sich, dass die Variablen nicht initialisiert sind, aber wie soll ich sie initialisieren, ohne wenn das durch einen String gemacht wird, der einen Fehler auslöst?


----------



## Prokyon114 (19. Jun 2019)

jetzt kommt: could not find or load main class FlaschenTest.java


```
public class FormenTest{

    public static GeometrischeForm erzeuge(String[] array) throws IndexOutOfBoundsException{

        String objektName = array[0];
        double array1 = Double.parseDouble(array[1]);
        double array2 = Double.parseDouble(array[2]);
        double array3 = Double.parseDouble(array[3]);

        try{
            objektName = array[0];
            array1 = Double.parseDouble(array[1]);
            array2 = Double.parseDouble(array[2]);
            array3 = Double.parseDouble(array[3]);
        }
        catch(IndexOutOfBoundsException e1){
            System.out.println("Fehler");
        }

        GeometrischeForm form;
        
        if(objektName == "Kreis"){
            form = new Kreis(array1);
        }
        else if(objektName == "Quadrat"){
            form = new Quadrat(array1);
        }
        else if(objektName == "Rechteck"){
            form = new Rechteck(array1, array2);
        }
        else if(objektName == "Dreieck"){
            form = new Dreieck(array1, array2, array3);   
        }
        else{
            return null;
        }
        return form;
    }
    public static void main(String[] args){
        String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
        String[] array1 = {"Quadrat", "3.0"};
        String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
        String[] array3 = {"Dreieckeck", "3.0", "4.0"};

        erzeuge(array0);
        erzeuge(array1);
        erzeuge(array2);
        erzeuge(array3);
    }
}
```


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> Jetzt beschwert der Compiler sich, dass die Variablen nicht initialisiert sind,



Edit 2: Das liegt daran, dass die Zuweisung im try-Block stattfindet, aber dieser ja fehlschlagen kann. In diesem Fall würden die Variablen tatsächlich uninitialisiert bleiben.



Prokyon114 hat gesagt.:


> aber wie soll ich sie initialisieren, ohne wenn das durch einen String gemacht wird, der einen Fehler auslöst?



`double a = 0.0;`

Wenn du die Variablen wieder mit einem Aufruf des Arrays initialisierst, dann wirst du auch wieder eine Exception erhalten.

Edit: Ich warne dich gleich mal vor; es gibt noch einiges, dass nicht so funktionieren wird, wie du es dir vorstellst. Aber mach erst mal weiter, dass kriegen wir schon hin


----------



## Prokyon114 (19. Jun 2019)

temi hat gesagt.:


> Edit 2: Das liegt daran, dass die Zuweisung im try-Block stattfindet, aber dieser ja fehlschlagen kann. In diesem Fall würden die Variablen tatsächlich uninitialisiert bleiben.
> 
> 
> 
> ...



Danke für deine aufmunternden Worte  Wenn ich das Programm jetzt so ausführe, dann spuckt er für die beiden ungültigen Objekte aus der Aufgabenstellung schonmal zwei Fehlermeldungen aus. Das funktioniert also schon mal! Ich bin jetzt hier angelangt:


> Implementieren Sie in FormenTest eine main-Methode. Sie soll mit den Arrays
> {"Dreieck", "3.0", "4.0", "5.0"}
> {"Quadrat", "3.0"}
> {"3eck", "3.0", "4.0", "5.0"}
> ...



Mein Code funktioniert natürlich wieder nicht:


```
public static void main(String[] args){
        String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
        String[] array1 = {"Quadrat", "3.0"};
        String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
        String[] array3 = {"Dreieckeck", "3.0", "4.0"};

        GeometrischeForm form1 = erzeuge(array0);
        GeometrischeForm form2 = erzeuge(array1);
        GeometrischeForm form3 = erzeuge(array2);
        GeometrischeForm form4 = erzeuge(array3);

        String formA = geoText(form1);
        String formB = geoText(form2);
        String formC = geoText(form3);
        String formD = geoText(form4);

    }
```

Wie bekomme ich es hin, dass die Methode geoText() funktioniert? (Sie gibt Informationen über das Objekt als String aus)


----------



## temi (19. Jun 2019)

Ist es sicher, dass geoText() eine Methode von FormenTest ist? In Zusammenhang mit den Methoden umfang() und flaeche() klingt es eher danach, als wäre sie eine Methode von GeometrischeForm.


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> Wenn ich das Programm jetzt so ausführe, dann spuckt er für die beiden ungültigen Objekte aus der Aufgabenstellung schonmal zwei Fehlermeldungen aus.



Bist du dir da sicher?

Für welche der vier Objekte wird denn die Fehlermeldung ausgegeben?


----------



## Prokyon114 (19. Jun 2019)

Ich habe verschiedene geoText() Methoden in den Klassen Kreis.java, Quadrat.java, usw. stehen, aber nicht in GeometrischeForm oder FormenTest. Beispiel:


```
public String geoText(){
        return "Es handelt sich um ein Rechteck mit den Seitenlaengen "+getA()+" und "+getB()+".";
    }
```


----------



## Prokyon114 (19. Jun 2019)

temi hat gesagt.:


> Bist du dir da sicher?
> 
> Für welche der vier Objekte wird denn die Fehlermeldung ausgegeben?


Es erscheint nur 2 mal "Fehler" auf der Konsole und in der Aufgabenstellung sind 2 fehlerhafte Objekte gegeben


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> Es erscheint nur 2 mal "Fehler" auf der Konsole und in der Aufgabenstellung sind 2 fehlerhafte Objekte gegeben



Nimm dir deine main() und kommentiere jeweils drei der vier Objekte aus, so dass nur eines davon erzeugt wird. Damit kannst du feststellen, welches genau einen Fehler erzeugt.

Es sollte dir zu denken geben, dass bei einem ungültigen Objektnamen keine Fehlermeldung erscheinen dürfte, sondern nur NULL zurück gegeben werden müsste.


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> Ich habe verschiedene geoText() Methoden in den Klassen Kreis.java, Quadrat.java, usw. stehen, aber nicht in GeometrischeForm oder FormenTest. Beispiel:
> 
> 
> ```
> ...



Dann ruf die doch einfach auf!


----------



## Prokyon114 (19. Jun 2019)

temi hat gesagt.:


> Nimm dir deine main() und kommentiere jeweils drei der vier Objekte aus, so dass nur eines davon erzeugt wird. Damit kannst du feststellen, welches genau einen Fehler erzeugt.
> 
> Es sollte dir zu denken geben, dass bei einem ungültigen Objektnamen keine Fehlermeldung erscheinen dürfte, sondern nur NULL zurück gegeben werden müsste.



Die Objekte 2 und 4 sind das, also die richtigen (Y)


----------



## Prokyon114 (19. Jun 2019)

temi hat gesagt.:


> Dann ruf die doch einfach auf!



GeometrischeForm.geoText(); -> "The method geoText() is undefined for the type Geometrische Form"
Kreis.geoText(); -> "Cannot make a static reference to the non-static method geoText() from the type Kreis"


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> Die Objekte 2 und 4 sind das, also die richtigen (Y)



Objekt 2 = form2 ?

Das sollte ein Quadrat mit einer Seitenlänge sein. Passt doch.


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> GeometrischeForm.geoText(); -> "The method geoText() is undefined for the type Geometrische Form"
> Kreis.geoText(); -> "Cannot make a static reference to the non-static method geoText() from the type Kreis"



Du sollst sie auch nicht auf die Klasse (= statische Methode) sondern auf die Instanz aufrufen (= nicht statische Methode).

Ist es durch die Aufgabe vorgegeben, dass geoText() zu jeweiligen Form gehören soll?

Dürft ihr auch abstrakte Methoden einsetzen?


----------



## Prokyon114 (19. Jun 2019)

temi hat gesagt.:


> Objekt 2 = form2 ?
> 
> Das sollte ein Quadrat mit einer Seitenlänge sein. Passt doch.



Hast Recht. Es wird nur beim ersten Objekt kein Fehler ausgegeben.


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> Hast Recht. Es wird nur beim ersten Objekt kein Fehler ausgegeben.



Und weißt du auch warum?

Denke daran, der Fehler wird ausgegeben, wenn es zu einer IndexOutOfBounds Exception kommt.


----------



## Prokyon114 (19. Jun 2019)

temi hat gesagt.:


> Und weißt du auch warum?
> 
> Denke daran, der Fehler wird ausgegeben, wenn es zu einer IndexOutOfBounds Exception kommt.



Naja, weil das erste Objekt das einzige ist, welches das Array komplett füllt. Dennoch habe ich keine Idee, wie ich dennoch ein Quadrat erstellen könnte.


----------



## temi (19. Jun 2019)

Prokyon114 hat gesagt.:


> Naja, weil das erste Objekt das einzige ist, welches das Array komplett füllt. Dennoch habe ich keine Idee, wie ich dennoch ein Quadrat erstellen könnte.



Korrekt. Du prüfst immer so, als ob ein maximal gefülltes Array vorliegen würde.

Du musst abhängig vom zu erzeugenden Objekt jeweils einen separaten try...catch-Block verwenden.

Das erste try..catch sollte die ersten beiden Parameter behandeln. Damit kannst du schon mal den Objektnamen korrekt zuweisen und da das minimalste Objekt ja mindestens eine Seitenlänge hat, kannst du auch gleich die mit zuweisen.

Edit: Noch eine kleine Anmerkung. if...else Blöcke halte ich für recht unübersichtlich. Anstatt von:

```
GeometrischeForm form;
        
if(objektName == "Kreis"){
  form = new Kreis(array1);
}
else if(objektName == "Quadrat"){
  form = new Quadrat(array1);
}
else if(objektName == "Rechteck"){
  form = new Rechteck(array1, array2);
}
else if(objektName == "Dreieck"){
  form = new Dreieck(array1, array2, array3);   
}
else{
  return null;
}
return form;
```

würde ich folgendes tun (und Strings vergleicht man übrigens immer mit equals()):


```
GeometrischeForm form = null;
        
if(objektName.equals("Kreis")) {
  form = new Kreis(array1);
}

if(objektName.equals("Quadrat")) {
  form = new Quadrat(array1);
}

if(objektName.equals("Rechteck")) {
  form = new Rechteck(array1, array2);
}

if(objektName.equals("Dreieck")) {
  form = new Dreieck(array1, array2, array3);   
}

return form;
```


----------



## Prokyon114 (19. Jun 2019)

Vielen Dank, habe deine Änderungen berücksichtigt und es auch so angepasst, dass der Fehler mit den Arrays nicht mehr passiert 


```
public class FormenTest{

    public static GeometrischeForm erzeuge(String[] array){

        GeometrischeForm form = null;

        try{
            String objektName = array[0];
            double array1 = Double.parseDouble(array[1]);
        
            if(objektName.equals("Kreis")){
                form = new Kreis(array1);
            }
            if(objektName.equals("Quadrat")){
                form = new Quadrat(array1);
            }
            if(objektName.equals("Rechteck")){
                double array2 = Double.parseDouble(array[2]);
                form = new Rechteck(array1, array2);
            }
            if(objektName.equals("Dreieck")){
                double array2 = Double.parseDouble(array[2]);
                double array3 = Double.parseDouble(array[3]);
                form = new Dreieck(array1, array2, array3);   
            }
        }
        catch(IndexOutOfBoundsException e1){
            System.out.println("Fehler");
        }
        return form;
    }
    public static void main(String[] args){
        String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
        String[] array1 = {"Quadrat", "3.0"};
        String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
        String[] array3 = {"Dreieck", "3.0", "4.0"};

        GeometrischeForm form1 = erzeuge(array0);
        GeometrischeForm form2 = erzeuge(array1);
        GeometrischeForm form3 = erzeuge(array2);
        GeometrischeForm form4 = erzeuge(array3);
    }
}
```


----------



## thecain (19. Jun 2019)

Ist die Anforderung wirklich die Index out of bounds exception zu catchen? Mit if die Länge zu prüfen wäre sonst vorzuziehen.


----------



## Prokyon114 (19. Jun 2019)

thecain hat gesagt.:


> Ist die Anforderung wirklich die Index out of bounds exception zu catchen? Mit if die Länge zu prüfen wäre sonst vorzuziehen.



Ja, leider ist es die Anforderung der Aufgabe


----------



## Prokyon114 (19. Jun 2019)

Nun weiß ich leider immer noch nicht, wie ich die geoText() Methode hier zum laufen bringe. Was heißt "auf die Instanz aufrufen"? Wäre das dann nicht form1.geoText() (form1 ist ja die Instanz/das Objekt, oder irre ich?)


----------



## kneitzel (19. Jun 2019)

Wie sieht denn Dein Code derzeit aus? Ich habe da jetzt im Augenblick keine genaue Vorstellung...


----------



## Prokyon114 (19. Jun 2019)

```
public class FormenTest{
    public static GeometrischeForm erzeuge(String[] array){
        GeometrischeForm form = null;
        try{
            String objektName = array[0];
            double array1 = Double.parseDouble(array[1]);

            if(objektName.equals("Kreis")){
                form = new Kreis(array1);
            }
            if(objektName.equals("Quadrat")){
                form = new Quadrat(array1);
            }
            if(objektName.equals("Rechteck")){
                double array2 = Double.parseDouble(array[2]);
                form = new Rechteck(array1, array2);
            }
            if(objektName.equals("Dreieck")){
                double array2 = Double.parseDouble(array[2]);
                double array3 = Double.parseDouble(array[3]);
                form = new Dreieck(array1, array2, array3);
            }
        }
        catch(IndexOutOfBoundsException e1){
            System.out.println("Fehler");
        }
        return form;
    }
    public static void main(String[] args){
        String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
        String[] array1 = {"Quadrat", "3.0"};
        String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
        String[] array3 = {"Dreieck", "3.0", "4.0"};
        GeometrischeForm form1 = erzeuge(array0);
        GeometrischeForm form2 = erzeuge(array1);
        GeometrischeForm form3 = erzeuge(array2);
        GeometrischeForm form4 = erzeuge(array3);
        form1.geoText();
    }
```

die Methode geoText() befindet sich wiederum jeweils in den Klassen Kreis, Quadrat, Rechteck, Dreieck mit:


```
public String geoText(){
        return "Es handelt sich um ein Dreieck mit den Seitenlaengen "+getA()+", "+getB()+" und "+getC()+".";
    }
```


----------



## Prokyon114 (19. Jun 2019)

Jedoch meckert der Compiler immer wegen "The method geoText() is undefined for the type Geometrische Form"
 oder "Cannot make a static reference to the non-static method geoText() from the type Kreis"


----------



## mihe7 (19. Jun 2019)

Die Methode muss es in GeometrischeForm schon auch geben.


----------



## Prokyon114 (19. Jun 2019)

mihe7 hat gesagt.:


> Die Methode muss es in GeometrischeForm schon auch geben.


Okay, aber was soll da rein? In Kreis, Rechteck, etc. wird ja ein String ausgegeben, der dann sagt, um welches Objekt es sich handelt. Bei GeometrischeForm kann man das ja alles sein.


----------



## kneitzel (19. Jun 2019)

Also die übliche Lösung für solche Situationen ist, die Methode auch in GeometrischeForm aufzunehmen. Da es da noch keine Implementation dafür gibt, wird die Klasse abstrakt und die Methode ist dann auch abstrakt.

Daher wurdest Du schon gefragt, ob die möglich ist oder nicht.

Eine andere Möglichkeit wäre, dass man hier ein Interface definiert und alle Klassen implementieren dann dieses Interface. Das ist nur dann notwendig, wenn GeometrischeForm dieses Interface nicht implementiert. Daher wäre dann als Code notwendig:
Prüfen, on form1 dieses Interfaces implementiert. So dies der Fall ist: Cast zu dem Interface und dann die Funktion aufrufen.

Ansonsten kannst Du natürlich auch auf alle Klassen prüfen ... also für jede Klasse prüfen, ob form1 instanceOf der Klasse ist um dann ggf. einen cast zu der Klasse zu machen und die Methode dann aufzurufen,


----------



## mihe7 (19. Jun 2019)

kneitzel hat gesagt.:


> Ansonsten kannst Du natürlich auch auf alle Klassen prüfen ... also für jede Klasse prüfen, ob form1 instanceOf der Klasse ist um dann ggf. einen cast zu der Klasse zu machen und die Methode dann aufzurufen,


Wobei man dazusagen sollte: @Prokyon114 mach das nicht.



Prokyon114 hat gesagt.:


> Bei GeometrischeForm kann man das ja alles sein.


Ja, genau deswegen gilt, was @kneitzel schrieb: GeometrischeForm ist abstrakt, denn die GeometrischeForm kann alles sein, _die_ GeometrischeForm gibt es nicht.

Theoretisch kannst Du auch einfach "GeometrischeForm" zurückgeben, weil die Methode in den Subklassen sowieso überschrieben wird. Besser ist es aber, die Methode abstrakt zu deklarieren, damit man erst gar keine Instanz von GeometrischeForm erstellen kann (denn, wie wir ja wissen: _die_ GeometrischeForm gibt es nicht).


----------



## kneitzel (19. Jun 2019)

mihe7 hat gesagt.:


> Wobei man dazusagen sollte: @Prokyon114 mach das nicht.



Ja, hätte ich deutlicher sagen sollen: die erste Version ist, wie man es machen sollte. Die beiden anderen Vorschläge sind nur gemacht worden für den Fall, dass die erste Lösung verboten sein sollte. Also wenn es z.B eine Vorgabe geben sollte, dass GeometrischeForm nicht verändert werden darf, dann wären das evtl. Optionen. Aber sowas in der Art ist ja bisher nicht gesagt worden. Daher ganz klar: Die erste Variante sollte die erste Wahl sein!


----------



## Prokyon114 (19. Jun 2019)

Okay, ist das so richtig aufgenommen:


```
public class GeometrischeForm{

    private double umfang;
    private double flaecheninhalt;

    public double getUmfang(){
        return umfang;
    }
    public double getFlaecheninhalt(){
        return flaecheninhalt;
    }
    public GeometrischeForm(){}

    public String geoText(){
        return null;
    }
    public double berechneUmfang(){
        return 0.0;
    }
    public double berechneFlaecheninhalt(){
        return 0.0;
    }

}
```


----------



## mihe7 (19. Jun 2019)

```
public abstract class GeometrischeForm{
    public abstract String geoText();
    public abstract double berechneUmfang();
    public abstract double berechneFlaecheninhalt();
}
```


----------



## Xyz1 (19. Jun 2019)

mihe7 hat gesagt.:


> Wobei man dazusagen sollte: @Prokyon114 mach das nicht.


@Prokyon114 Man muss dazu sagen, dass @kneitzel s Beiträge den Anspruch erheben, Gesetz zu sein... Dass dabei gelegentlich auch mal durch ihn ins Klo gegriffen wird, wird dabei gerne verschwiegen...


----------



## mihe7 (19. Jun 2019)

Tobias-nrw hat gesagt.:


> Man muss dazu sagen, dass @kneitzel s Beiträge den Anspruch erheben, Gesetz zu sein...


Also ich habe hier noch keinen erlebt, der diesen Anspruch erheben würde.


----------



## Prokyon114 (19. Jun 2019)

mihe7 hat gesagt.:


> ```
> public abstract class GeometrischeForm{
> public abstract String geoText();
> public abstract double berechneUmfang();
> ...



jetzt heißt es "abstract methods do not define a body"


----------



## mrBrown (19. Jun 2019)

Tobias-nrw hat gesagt.:


> @Prokyon114 Man muss dazu sagen, dass @kneitzel s Beiträge den Anspruch erheben, Gesetz zu sein... Dass dabei gelegentlich auch mal durch ihn ins Klo gegriffen wird, wird dabei gerne verschwiegen...


Mal wieder: Wenn du nichts als dumme Pöbeleien beizutragen hast, halt dich bitte aus Themen raus.


----------



## Prokyon114 (19. Jun 2019)

Irgendwie habe ich das Gefühl, dass meine ganze Aufgabe ein Griff ins Klo ist, es erweckt den Anschein, dass vorne und hinten alles nicht stimmt...


----------



## Prokyon114 (19. Jun 2019)

Ich schicke mal die komplette Aufgabenstellung und alles, was ich bisher habe, rein. Vielleicht geht ja noch etwas Schadensbegrenzung... Es handelt sich um Aufgabe 2


----------



## Prokyon114 (19. Jun 2019)

Code:

```
public abstract class GeometrischeForm{

    private double umfang;
    private double flaecheninhalt;

    public double getUmfang(){
        return umfang;
    }
    public double getFlaecheninhalt(){
        return flaecheninhalt;
    }
    public GeometrischeForm(){}

    public abstract String geoText(){
    }
    public abstract double berechneUmfang(){
    }
    public abstract double berechneFlaecheninhalt(){
    }
}


public class Kreis extends GeometrischeForm{

    private double r;

    public double getR(){
        return r;
    }
    public void setR(double r){
        if(r < 0){
            r = -r;
        }
        this.r = r;
    }
    public Kreis(double r){
        this.r = r;
    }

    public String geoText(){
        return "Es handelt sich um einen Kreis mit dem Radius "+getR()+".";
    }

    public double berechneUmfang(){
        double umfang = 2*Math.PI*getR();
        return umfang;
    }
    public double berechneFlaecheninhalt(){
        double flaecheninhalt = Math.PI*getR()*getR();
        return flaecheninhalt;
    }
}


public class Quadrat extends GeometrischeForm{

    private double a;

    public double getA(){
        return a;
    }
    public void setA(double a){
        if(a < 0){
            a = -a;
        }
        this.a = a;
    }

    public Quadrat(double a){
        this.a = a;
    }

    public String geoText(){
        return "Es handelt sich um ein Quadrat mit der Seitenlaenge "+getA()+".";
    }

    public double berechneUmfang(){
        double umfang = 4*getA();
        return umfang;
    }
    public double berechneFlaecheninhalt(){
        double flaecheninhalt = getA()*getA();
        return flaecheninhalt;
    }
}


public class Rechteck extends Quadrat{

    private double b;

    public double getB(){
        return b;
    }
    public void setB(double b){
        if(b < 0){
            b = -b;
        }
        this.b = b;
    }

    public Rechteck(double a, double b){
        super(a);
        this.b=b;
    }

    public String geoText(){
        return "Es handelt sich um ein Rechteck mit den Seitenlaengen "+getA()+" und "+getB()+".";
    }

    public double berechneUmfang(){
        double umfang = 2*getA()+2*getB();
        return umfang;
    }
    public double berechneFlaecheninhalt(){
        double flaecheninhalt = getA()*getB();
        return flaecheninhalt;
    }
}


public class Dreieck extends Rechteck{

    private double c;

    public double getC(){
        return c;
    }
    public void setC(double c){
        if(c < 0){
            c = -c;
        }
        this.c = c;
    }
    public Dreieck(double a, double b, double c){
        super(a, b);
        this.c = c;
    }

    public String geoText(){
        return "Es handelt sich um ein Dreieck mit den Seitenlaengen "+getA()+", "+getB()+" und "+getC()+".";
    }

    public double berechneUmfang(){
        double umfang = getA()+getB()+getC();
        return umfang;
    }
    public double berechneFlaecheninhalt(){
        double s = 0.5*(getA()+getB()+getC());
        double flaecheninhalt = Math.sqrt(s*(s-getA())*(s-getB())*(s-getC()));
        return flaecheninhalt;
    }
}


public class FormenTest{

    public static GeometrischeForm erzeuge(String[] array){

        GeometrischeForm form = null;

        try{
            String objektName = array[0];
            double array1 = Double.parseDouble(array[1]);
        
            if(objektName.equals("Kreis")){
                form = new Kreis(array1);
            }
            if(objektName.equals("Quadrat")){
                form = new Quadrat(array1);
            }
            if(objektName.equals("Rechteck")){
                double array2 = Double.parseDouble(array[2]);
                form = new Rechteck(array1, array2);
            }
            if(objektName.equals("Dreieck")){
                double array2 = Double.parseDouble(array[2]);
                double array3 = Double.parseDouble(array[3]);
                form = new Dreieck(array1, array2, array3);   
            }
        }
        catch(IndexOutOfBoundsException e1){
            System.out.println("Fehler");
        }
        return form;
    }
    public static void main(String[] args){
        String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
        String[] array1 = {"Quadrat", "3.0"};
        String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
        String[] array3 = {"Dreieck", "3.0", "4.0"};

        GeometrischeForm form1 = erzeuge(array0);
        GeometrischeForm form2 = erzeuge(array1);
        GeometrischeForm form3 = erzeuge(array2);
        GeometrischeForm form4 = erzeuge(array3);

        try{
            form1.geoText();
            form2.geoText();
            form3.geoText();
            form4.geoText();
        
            form1.berechneFlaecheninhalt();
            form2.berechneFlaecheninhalt();
            form3.berechneFlaecheninhalt();
            form4.berechneFlaecheninhalt();

            form1.berechneUmfang();
            form2.berechneUmfang();
            form3.berechneUmfang();
            form4.berechneUmfang();
        
        }
        catch(NullPointerException n1){
            System.out.println("Null");
        }
    }
}
```


----------



## Prokyon114 (19. Jun 2019)




----------



## mihe7 (19. Jun 2019)

Prokyon114 hat gesagt.:


> jetzt heißt es "abstract methods do not define a body"


Ja, weil z. B 

```
public abstract String geoText(){
}
```
etwas anderes ist als

```
public abstract String geoText();
```


----------



## Prokyon114 (19. Jun 2019)

Okay, habe es geändert. Es gibt keinen Compilerfehler und das Programm läuft durch. Die Ausgaben aus den verschiedenen geoText() Methoden der Subklassen werden leider nicht getätigt.


----------



## kneitzel (19. Jun 2019)

Tobias-nrw hat gesagt.:


> @Prokyon114 Man muss dazu sagen, dass @kneitzel s Beiträge den Anspruch erheben, Gesetz zu sein... Dass dabei gelegentlich auch mal durch ihn ins Klo gegriffen wird, wird dabei gerne verschwiegen...


Was soll so eine Aussage? Wo habe ich so etwas jemals behauptet? Aber nein - der Herr wird auch jetzt hier garantiert unfähig sein, Argumente zu bringen, daher ist es einfach sinnlos.

Was Dir entgangen sein dürfte: Alle drei Ideen sind valide Lösungen. Und Deine unqualifizierten Toll-Postings kannst Du Dir wirklich ersparen.


----------



## mihe7 (19. Jun 2019)

Prokyon114 hat gesagt.:


> Die Ausgaben aus den verschiedenen geoText() Methoden der Subklassen werden leider nicht getätigt.


Welche Ausgaben?


----------



## Prokyon114 (19. Jun 2019)

siehe: public class Rechteck und dann die geoText() Methode, post #96


----------



## mihe7 (19. Jun 2019)

Prokyon114 hat gesagt.:


> siehe: public class Rechteck und dann die geoText() Methode


Ja, aber wo ist das eine Ausgabe? Ich sehe nur eine Rückgabe.


----------



## Prokyon114 (19. Jun 2019)

Okay, ich habe es jetzt mit Ach und Krach zum laufen gebracht. Ich bedanke mich auf jeden Fall tausend mal für eure zahlreichen Hinweise und euer Durchhaltevermögen


----------



## mihe7 (20. Jun 2019)

Wie sieht denn Deine Lösung jetzt aus?


----------

