Objekt aus String-Array erzeugen

Prokyon114

Aktives Mitglied
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:

Java:
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
 
Habe folgendes Gerüst:
Ist das Gerüst von dir oder gegeben? Falls ersteres, schmeiß es weg, dass geht am verlangten vorbei 😉

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.
 
Hi, habe mein Gerüst über Bord geworfen. Habe nun folgendes (Code noch nicht vollständig):

Java:
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:

Java:
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
 
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.
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...)
 
Mal getesteten, ob das kompiliert?


Und wenn die Werte jetzt in Variablen gespeichert sind?

Java:
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.
 
Hältst Du es wirklich für sinnvoll, einer Variablen vom Typ double den Namen stringA zu geben?

Nein, da hast du Recht.


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


Java:
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?
 
Und braucht man zum deklarieren einer Variable deren Konstruktor?
Java:
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;
    }

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

Ok, wird wohl daran liegen, dass es nicht public ist... *schäm*
 
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.

Java:
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;
    }
 
Ä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?
 
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
 
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.
 
Ä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
 

Neue Themen


Zurück
Oben