Methode aus main() aufrufen

Themanofrofl

Grünschnabel
Ich weiß, dass main() static ist und daher kann ich ja folglich keine nicht-statischen Methoden direkt aus der Instanz dieser Klasse in der sich auch main befindet, aufrufen.

Das ganze ist allerdings auch noch ein bisschen komplizierter. Im Grunde will ich eine Methode aufrufen, die in einem Objekt definiert ist.
Dieses Objekt steckt allerdings wiederum in einem Array voller dieser Objekte.
Das Array mit den Objekten wird durch ein weiteres Objekt initiiert, das nur für diesen Zweck erschaffen wurde.

Schön und gut, also 2 neue Klassen, die eine instanzieren, Methoden durch Punktoperator aufrufen und... cannot find symbol - variable Arrayname.

Leider bin ich kein Java Guru, habe Java zuletzt vor einem Jahr genutzt und zu allem überfluss will mein Lehrer nicht das man statische Methoden benutzt weil wir das noch nicht hatten.

Mist, also hier ist wie ich das ganze aufgeschrieben habe:



//Objekt1
// code...

Objekt2[] Arrayname = new Objekt2[Objektanzahl];

// noch mehr code...



und in main() siehts dann so aus:


//Hauptobjekt
//ganz viel bla
Arrayname[objektnummer].beispielmethode ;
//nochmal viel bla


einer ne Idee was man machen könnte? Ich vermute ja einen Grundlegenden Fehler, so offensichtlich dass ichs erst recht nicht entdecke :D
 
Du solltest dir mal grundlegende Java-Kenntnisse aneignen, z.B. mit Hilfe der Javainsel: http://openbook.galileocomputing.de/javainsel9/index.htm#_top

Außerdem wäre es wirklich hilfreich, wenn du deine Code auch in Code-Tags packst, dann lässt er sich leichter lesen (siehe meine Signatur).

Nun zu deinem Problem:
Du kannst aus einer statischen Methode heraus sehr wohl nicht-statische Methoden aufrufen. Du musst dafür nur ein Objekt erzeugen (oder dir irgendwie anders Zugriff auf ein Objekt beschaffen). Schematisch:
Java:
public class Starter {

   Starter(){// Das hier ist der Constructor
      // hier eingefügter Code wird beim Erstellen eines Objekts von "Starter" ausgeführt.
   }

   public static void main(String[] args){
      // hier beginnt die Ausführung deines Programmes
      Starter s = new Starter(); // erzeuge eine Instanz der Klasse "Starter" (=Objekt)
      s.start(); // hier kannst du problemlos eine nicht-statische Methode aufrufen
      // Vorraussetzung: du brauchst eine Referenz auf das Objekt, z.B. indem du es erzeugst
   }

   private void start(){
      // ...
   }
}

}
 
Und so als Tipp nebenbei Variablennamen schreibt man klein :)
Die Loesung hat dir genodeftest ja schon gegeben
 
Am einfachsten ist es wenn du in der main() eine sog. Selbstinstanzierung machst. Also so

Java:
import foo.bar.*;
public class Foo
{
	public static void main(String[] args) { (new Foo(args)).bar(); }
	public Foo(String[] args)
	{
		//Verarbeitung von args
	}
	public void bar()
	{
		//Eigentlicher Programmstart
	}
}
Dadurch erreichst du das du dann ab dem Konstruktor nicht mehr STATIC bist ... und kannst desshalb dann schon auf "this" zugreifen. Ich mache es immer so das ich den Konstruktor private mache damit man die Klasse nicht von externen Klassen aus instanzieren kann und verarbeite dann im Konstruktor erstmal das übergebene String-Array. Die dann aufgerufene Methode ist dann mein eigentlicher Programmstart und wird von mir meist auch private gehalten um den "Einstiegspunkt" nach außen hin zu verstecken. Generell ist bei mir eigentlich alles private. Objekte oder Methoden die ich innerhalb des Package verwende natürlich protected. Die einzige ausnahme bilded mein Plug-In-System in dem zum Zugriff über reflections die nötigen Methoden der Einfachheit halber public sind da ich mit java.lang.reflect.AccessibleObject.setAccessible(boolean) irgendwie Probleme habe. Aber wie gesagt ... das ist die einzige Ausnahme in meinem sonst sehr strengen private/protected-Konzept.
 
Ähm ... shame on me ...
Ja natürlich ... ey ich sollte langsam anfangen fremde Codes auch mal verstehen zu wollen ...
*keinen weiteren Kommentar*
 
Tschuldigung, dass ich mich so missverständlich ausgedrückt habe und zu allem überfluss nicht die Code Tags genutzt habe.
War ein wenig in Eile(ist aber auch egal)...

soo erstmal @genodeftest
Ich weiß, dass main() static ist und daher kann ich ja folglich keine nicht-statischen Methoden direkt aus der Instanz dieser Klasse in der sich auch main befindet, aufrufen.
Du kannst aus einer statischen Methode heraus sehr wohl nicht-statische Methoden aufrufen. Du musst dafür nur ein Objekt erzeugen (oder dir irgendwie anders Zugriff auf ein Objekt beschaffen).

Hmm, ich meine eigentlich das gleiche... Ich kann aber keine nicht-statische Methode aus der Klasse aufrufen in der sich auch main() befindet. Dazu brauche ich (wie du ja auch richtig sagst) ein anderes Objekt das diese Methode beinhaltet.

Wenn main() gar keine Methode aufrufen könnte, könnte man in Java schließlich auch nicht programmieren :D (oder halt nur prozedual, was wiederum den Sinn von Java verfehlt).

Soo, weiter: ich weiß wie man Variablennamer schreibt(klein) :p

Bevor ich hier rede und rede und sage was ich gemacht habe und was nicht schaut euch das ganze einfach an.

Code:
public class Hundeapp{
    public static void main(String[] args){
        Wurfmaschine W1 = new Wurfmaschine();
        W1.sethundeanzahl();
        W1.Hundeerstellen();
        for(int schleife=0;schleife<W1.gethundeanzahl(); schleife++){
            Hunde[schleife].bellen();
            Hunde[schleife].eigenschaften();
        }
    }
}
Code:
import javax.swing.*;
public class Wurfmaschine{
    private int hundeanzahl;
    public void Hundeerstellen(){
        
        //Erstelle Hundeobjekte
        for(int i=0;i<hundeanzahl;i++){       
            
            Hund[] Hunde = new Hund[hundeanzahl]; // Achtung: "Hunde" ist das Array der ganzen "Hund" Objekte!
                                                // ja, this ist nicht notwendig, ich weiß...
            Hunde[i].setgröße(this.randomgröße());
            Hunde[i].setrasse(this.randomrasse());
            Hunde[i].setname(this.randomname());
            Hunde[i].setgewicht(this.randomgewicht());
            Hunde[i].setanzahlbellen(this.randomanzahlbellen());
            Hunde[i].setlaut(this.randomlaut());
        }
    }
    public void sethundeanzahl() { //Exeptions wären hier unbedingt angebracht!!
        String hundeanzahlstring = JOptionPane.showInputDialog( "Wieviele Hunde sollen geworfen werden?");
        this.hundeanzahl=Integer.parseInt(hundeanzahlstring);
    }
    private double randomgröße(){
        return Math.random()*120;
    }
    private double randomgewicht(){
        return Math.random()*60;
    }
    private String randomrasse(){
        String[] rassen= {"Dalmatiner","Fußhupe","Deutscher Schäferhund","vom Mars","Hax0r"}; 
        return rassen[(int)Math.random()*rassen.length];
    }
    private String randomname(){
        String[] namen= {"Harry","Plokro","Ytsori","Rex","zufig","1337"};
        return namen[(int)Math.random()*namen.length];
    }
    private int randomanzahlbellen(){
        return (int)Math.random()*5;
    }
    private String randomlaut(){
        String[] laute= {"pfuuf","Wuff","Wau","Pasdouf","1337"};
        return laute[(int)Math.random()*laute.length];
    }
    
    public int gethundeanzahl(){
        return hundeanzahl;
    }
}
Code:
class Hund{
//ist eigentlich total unwichtig... es enthält alles und läuft ohne Array ganz normal.
}

Der Fehler liegt hier wie gesagt darin, dass er das Objekt im Array nicht anspricht und mir einfach nur sagt:
"cannot find symbol - variable Hund"
Klasse Hundeapp Zeile 7 (8 wird dann ja auch falsch sein)

Also, es wird ein Objekt der Klasse Wurfmaschine instanziert, dann wird aus der Instanz die Methode Hundeerstellen() aufgerufen. Diese macht ihren Dienst auch wie sie sollte. Nur in main() kommt dann die Aufrufung einer Methode in einem Objekt der Klasse Hund, welches sich dann im Array Hunde[] befindet. Und genau dort im Schlussteil läuft es nicht. Ganz simpel sollte man meinen. Dennoch kann ich es nicht. :rolleyes:

Schonmal Danke für die schnelle Antwort und Beratung aber auch schonmal danke für kommende Hilfe :)

ps: Wenn nochmal jemand etwas wegen nichteingehaltenen Konventionen sagt, dann lasst euch gesagt sein, dieses Beispielprogramm für meinen Infolehrer ist nicht SOOooo wichtig,
im ernst... :DD

Danke
 
Hallo,

ich sehe in Deinem Code keine Variable, (e.g. Array) die Hunde beinhaltet, in der "Wurfmaschine" (lol) also deutet der Fehler ("cannot find symbol - variable Hund") darauf hin, dass keine Variable mit Namen "Hund" erstellt wurde! (wobei glaub ich Hunde gemeint ist, sonst wäre es ja Dein Klassenname)

Sieh Dir mal folgenden Code an:

Java:
public class Hundeapp{
    public static void main(String[] args){
        Wurfmaschine W1 = new Wurfmaschine();
        W1.sethundeanzahl();
        W1.Hundeerstellen();

        Hund[] hundeArray = W1.getHundeArray();
        for(int schleife=0;schleife<W1.gethundeanzahl(); schleife++)
       {
            hundeArray [schleife].bellen();
            hundeArray [schleife].eigenschaften();
        }
    }
}


dazu musst Du die erstellten Hunde in einer lokalen Variable in der Klasse Hund "Containern" also irgendwo speichern.

Java:
import javax.swing.*;
public class Wurfmaschine{
    private int hundeanzahl;
    private Hund[] hundeArray = null;
    public void Hundeerstellen(){
        //Erstelle Hundeobjekte
Hund[] Hunde = new Hund[hundeanzahl]; // Achtung: "Hunde" ist das Array der ganzen "Hund" Objekte!
        for(int i=0;i<hundeanzahl;
                                                // ja, this ist nicht notwendig, ich weiß...
            
            Hunde[i].setgröße(this.randomgröße());
            Hunde[i].setrasse(this.randomrasse());
            Hunde[i].setname(this.randomname());
            Hunde[i].setgewicht(this.randomgewicht());
            Hunde[i].setanzahlbellen(this.randomanzahlbellen());
            Hunde[i].setlaut(this.randomlaut());
        }
            hundeArray = Hunde;
    }
    public void sethundeanzahl() { //Exeptions wären hier unbedingt angebracht!!
        String hundeanzahlstring = JOptionPane.showInputDialog( "Wieviele Hunde sollen geworfen werden?");
        this.hundeanzahl=Integer.parseInt(hundeanzahlstring);
    }
    private double randomgröße(){
        return Math.random()*120;
    }
    private double randomgewicht(){
        return Math.random()*60;
    }
    private String randomrasse(){
        String[] rassen= {"Dalmatiner","Fußhupe","Deutscher Schäferhund","vom Mars","Hax0r"}; 
        return rassen[(int)Math.random()*rassen.length];
    }
    private String randomname(){
        String[] namen= {"Harry","Plokro","Ytsori","Rex","zufig","1337"};
        return namen[(int)Math.random()*namen.length];
    }
    private int randomanzahlbellen(){
        return (int)Math.random()*5;
    }
    private String randomlaut(){
        String[] laute= {"pfuuf","Wuff","Wau","Pasdouf","1337"};
        return laute[(int)Math.random()*laute.length];
    }
    
    public int gethundeanzahl(){
        return hundeanzahl;
    }
    public Hund[] getHundeArray(){
    return hundeArray;
    }
}

und vergiss bitte nicht, das Array in hundeErstellen ausserhalb der Schleife zu erstellen, denn sonst ist es immer nur mit einem Hund befüllt!

Viele Grüße
 
Zuletzt bearbeitet von einem Moderator:
@VScan
Danke für die Antwort und ja, klar, die Fehlermeldung spricht von "Hunde" nicht von "Hund". :)
Ich verstehe nur nicht ganz wieso ich nicht gleich das Array Hunde nutzen kann und noch das Array HundeArray erstellen sollte. erscheint mir redundant.
Ich erstelle ja per
Java:
Hund[] Hunde = new Hund[hundeanzahl];
ein Array mit genausovielen Hunden drinne wie ich in hundeanzahl angegeben habe. Wozu jetzt nochmal ein Array? Und wieso kann ich das nicht in Hundeapp.main() ansprechen?

Funktioniert das nicht weil ich das Array in Objekt W1 erstellt habe und das so nicht sichtbar in Hundeapp ist? Muss ich deshalb mir NOCH ein Array erstellen und über den getter das eine Array in das andere packen?
(so wie du es mit
Java:
Hund[] hundeArray = W1.getHundeArray();
gemacht hast?)

Würde zwar Sinn ergeben, ist aber ist doch ziemlich umständlich, oder?
 
Zuletzt bearbeitet von einem Moderator:
Aua ... 2 ganz böse Fehler in deinem Source

1) das Array Hund[] hunde *wirklich ... hier solltest du dich nach der Konvetion richten da beim vergessen des "e" ganz schnell zu extrem langen Error-Meldungen führen kann obwohl es nur an einem Buchstaben liegt* INNERHALB der for() erstellen resultiert in drei Problemen
a) Hund[] hunde ist außerhalb der for() garnicht bekannt
b) Hund[] hunde enthält maximal EIN Objekt
c) Wenn die for() durchgelaufen ist wird Hund[] hunde vom GC wieder aufgeräumt.
Hier also wirklich auf VScan hören und das Array AUßERHALB der for() erstellen.

2) Du versuchst in HundeApp auf ein protected-Objekt in Wurfmaschine zuzugreifen. So lange beide Klassen im selben Package sind ist das auch kein Problem. Aber woher soll HundeApp denn bitte Hund[] w1.hunde kennen wenn du nur auf Hund[] hunde zugreifen willst ? Denn das exisitiert in HundeApp so nicht ... nur w1.hunde ... und auch nur dann wenn du es außerhalb der for() erstellst ... ansonsten kennt nicht mal Wurfmaschine selbst diese Objekt.

Und noch als kleine Anmerkung : Natürlich kannst du auch auf NONE-STATIC - Methode der Klasse zugreifen in der es eine public static void main(String[]) gibt ... nur musst du in der main ein Objekt dieser Klasse erzeugen und dann damit arbeiten.

Ich glaube dir fehlen hier noch einige Grundlagen die dir dein Info-Lehrer entweder noch nicht vermittelt hat oder die du nicht richtig verstanden hast. Lasse dir deine Fehler am beesten mal von deinem Info-Lehrer erklären da du unsere Erklärungen ja scheinbar auch nicht verstehst.
 

Neue Beiträge

Zurück