Objekt aus String-Array erzeugen

Meinen Beitrag gelöscht. Hatte auf einen Beitrag geantwortet und auf dem Handy nicht gesehen, dass es ja schon viel mehr gab ...
 
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?
 
jetzt kommt: could not find or load main class FlaschenTest.java

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

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 😉
 
Zuletzt bearbeitet:
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.



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 😉

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"}
{"Dreieck", "3.0", "4.0"}
mit erzeuge geometrische Objekte erzeugen und dann die geoText, die flaeche und die umfang- Methode verwenden, um Informationen über das Objekt auszugeben. Bei einer ungültigen Eingabe, also wenn die erzeuge-Methode null zurückgegeben hat, soll eine entsprechende Meldung ausgegeben werden (Hinweis: Abfangen der NullPointerException).

Mein Code funktioniert natürlich wieder nicht:

Java:
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)
 
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.
 
Ich habe verschiedene geoText() Methoden in den Klassen Kreis.java, Quadrat.java, usw. stehen, aber nicht in GeometrischeForm oder FormenTest. Beispiel:

Java:
public String geoText(){
        return "Es handelt sich um ein Rechteck mit den Seitenlaengen "+getA()+" und "+getB()+".";
    }
 
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.
 
Ich habe verschiedene geoText() Methoden in den Klassen Kreis.java, Quadrat.java, usw. stehen, aber nicht in GeometrischeForm oder FormenTest. Beispiel:

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

Dann ruf die doch einfach auf!
 
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)
 
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?
 
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:
Java:
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()):

Java:
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;
 
Zuletzt bearbeitet:
Vielen Dank, habe deine Änderungen berücksichtigt und es auch so angepasst, dass der Fehler mit den Arrays nicht mehr passiert 🙂

Java:
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);
    }
}
 
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?)
 
Wie sieht denn Dein Code derzeit aus? Ich habe da jetzt im Augenblick keine genaue Vorstellung...
 
Java:
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:

Java:
 public String geoText(){
        return "Es handelt sich um ein Dreieck mit den Seitenlaengen "+getA()+", "+getB()+" und "+getC()+".";
    }
 
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"
 
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,
 
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.

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).
 
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!
 
Okay, ist das so richtig aufgenommen:

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

}
 
Java:
public abstract class GeometrischeForm{
    public abstract String geoText();
    public abstract double berechneUmfang();
    public abstract double berechneFlaecheninhalt();
}
 
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
 

Anhänge

  • Blatt 2.jpg
    Blatt 2.jpg
    459,3 KB · Aufrufe: 23
  • Blatt 3.jpg
    Blatt 3.jpg
    330,9 KB · Aufrufe: 24
Code:
Java:
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");
        }
    }
}
 
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.
 
@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.
 

Neue Themen


Zurück
Oben