Das Thema wurde hier schon oft erklärt und ich habe eigentlich auch gedacht, dass ich es einigermaßen verstanden habe, aber mein Programm, das ich gerade programmiere, hat mich leider eines besseren belehrt...
Instanzmethoden rufe ich doch auf mit "Instanzname.Methodenname ()", oder? Bei mir kommt dann aber beim Compilieren die Fehlermeldung "cannot resolve symbol symbol: method Methodenname". An was kann das liegen?
Außerdem habe ich noch folgendes Problem: Ich muss in meiner Datei zwei Klassen schreiben. In der ersten wird ein neuer Typ festgelegt, bei mir jetzt Datensatz. Wenn ich jetzt aber in einer Methode der zweiten Klasse zb this.Betrag aufrufe (Betrag kommt im Typ Datensatz vor), um damit zu rechnen etc, dann kommt ebenfalls beim Compilieren "cannot resolve symbol". Liegt das daran, dass es zwei verschiedene Klassen sind? Aber wenn ich in der zweiten Klasse eine neue Variable vom Typ Datensatz anlege, funktioniert das ja auch.
Außerdem habe ich noch folgendes Problem: Ich muss in meiner Datei zwei Klassen schreiben. In der ersten wird ein neuer Typ festgelegt, bei mir jetzt Datensatz. Wenn ich jetzt aber in einer Methode der zweiten Klasse zb this.Betrag aufrufe (Betrag kommt im Typ Datensatz vor), um damit zu rechnen etc, dann kommt ebenfalls beim Compilieren "cannot resolve symbol". Liegt das daran, dass es zwei verschiedene Klassen sind? Aber wenn ich in der zweiten Klasse eine neue Variable vom Typ Datensatz anlege, funktioniert das ja auch.
Du hast ne Klasse Datensatz und ne andere Klasse xyz. In xyz hast du ein Objekt des Typs Datensatz erzeugt und versuchst mit this.Betrag darauf zuzugreifen? Sollte dem so sein, so kann das nicht klappen, da this sich auf das aktuelle Objekt der Klasse bezieht.
Aber wie meez schon geschrieben hat, poste am besten mal den code deiner beiden klassen.
Der Fehler wie erwartet.....Du bist in der Klasse Ausgaben, dort rufst du this.zeigeDaten() auf, this verweist aber auf das aktuelle Objekt der aktuellen Klasse. Das bedeutet also, dass du in Ausgaben die Methode zeigeDaten() aufrufen willst, das funzt natürlich net.
Falls sonst noch Fehler wirst das nachher gewahr,muss ma gerad off....
Variablennamen sollten klein geschrieben werden. Warum verwendest du manchmal protected und manchmal nicht? Wird die Klasse irgendwo vererbt ? Ansonsten mach private und schreib entsprechende getter/setter Methoden.
Code:
//Klasse Ausgaben
public class Ausgaben{
int n;
protected Datensatz [] Verpfl = new Datensatz [n];
//Konstruktor, in dem n Datensätze angelegt und in Verpfl gespeichert werden
public Ausgaben(int n){
for (int i=0; i<n; i++){
Verpfl[i] = new Datensatz(); //Konstruktor in Klasse Datensatz wird aufgerufen
}
}
public double zeigeAusgaben(){
this.zeigeDaten();
Fehler wie oben beschrieben. DIe Klasse Ausgaben verfügt nicht über eine solche Methode. Deswegen -> cannot resolve symbol. Stattdessen könntest du der Methode einen int-Wert übergeben, der angibt um welchen Datensatz (Verpflichtungen) es sich handelt, so dass du mit Verpfl.zeigeDaten() etc. weiter machen kannst...
Was soll das? Ich mein was soll Verpfl.Ausgaben? Willst du etwa ein neues Objekt vom Typ Ausgaben erzeugen? Das geht mit new....Verpfl hast du doch schon deklariert....
import Prog1Tools.IOTools;
//Klasse Datensatz
class Datensatz{
protected double Betrag;
protected int Tag, Monat; //Datum
int Haeufigkeit;
protected String Beschreibung, Glaeubiger;
String Leerzeile1, Leerzeile2;
Variablennamen sollten klein geschrieben werden. Warum verwendest du manchmal protected und manchmal nicht? Wird die Klasse irgendwo vererbt ? Ansonsten mach private und schreib entsprechende getter/setter Methoden.
Wir haben eine Art "Anleitung" zu den Programmen, wie wir sie programmieren müssen und da steht dann halt manchmal geschützt, manchmal nicht. Ich muss mich da halt dran halten. Manche Variablen sind auch angegeben, so wie die oben.
Code:
//Klasse Ausgaben
public class Ausgaben{
int n;
protected Datensatz [] Verpfl = new Datensatz [n];
//Konstruktor, in dem n Datensätze angelegt und in Verpfl gespeichert werden
public Ausgaben(int n){
for (int i=0; i<n; i++){
Verpfl[i] = new Datensatz(); //Konstruktor in Klasse Datensatz wird aufgerufen
}
}
public double zeigeAusgaben(){
this.zeigeDaten();
Fehler wie oben beschrieben. DIe Klasse Ausgaben verfügt nicht über eine solche Methode. Deswegen -> cannot resolve symbol. Stattdessen könntest du der Methode einen int-Wert übergeben, der angibt um welchen Datensatz (Verpflichtungen) es sich handelt, so dass du mit Verpfl.zeigeDaten() etc. weiter machen kannst...
Du meinst also, dass ich in der main dann zeigeAusgaben aufrufe und i übergebe? Und dann Verpfl.zeigeDaten() aufrufe. In zeigeDaten kann ich dann aber mit this arbeiten, oder?
Es kommt jetzt aber immer noch u.a. der Fehler "cannot resolve symbol symbol: method zeige Ausgaben(int)", dabei ist die Methode doch in der selben Klasse wie main... Ich versteh das nicht...
Jetzt sind's noch mehr Fehler... und zwar "non-static variable Verpfl cannot be referenced from a static context
Verpfl = new Datensatz [n]", das gleiche bei anderen Variablen...
Code:
int n;
n = IOTools.readInteger("Anzahl der Datensätze: ");
Verpfl = new Datensatz [n];
Verpfl.Ausgaben(n);
Was soll das? Ich mein was soll Verpfl.Ausgaben? Willst du etwa ein neues Objekt vom Typ Ausgaben erzeugen? Das geht mit new....Verpfl hast du doch schon deklariert....
Wir haben eine Art "Anleitung" zu den Programmen, wie wir sie programmieren müssen und da steht dann halt manchmal geschützt, manchmal nicht. Ich muss mich da halt dran halten. Manche Variablen sind auch angegeben, so wie die oben.
Ok, kenn ich....dachte nur es würde nicht so viel Sinn machen, aber wenn du es so machen "musst"....
Du meinst also, dass ich in der main dann zeigeAusgaben aufrufe und i übergebe? Und dann Verpfl.zeigeDaten() aufrufe. In zeigeDaten kann ich dann aber mit this arbeiten, oder?
Es kommt jetzt aber immer noch u.a. der Fehler "cannot resolve symbol symbol: method zeige Ausgaben(int)", dabei ist die Methode doch in der selben Klasse wie main... Ich versteh das nicht...
Ok - ist die Methode so vergegeben? Also mit dieser Signatur ? (soll heissen Rückgabewert,Parameter etc.) ?
Jetzt sind's noch mehr Fehler... und zwar "non-static variable Verpfl cannot be referenced from a static context
Verpfl = new Datensatz [n]", das gleiche bei anderen Variablen...
Jo, dann musst Verpfl halt static machen. Ansonsten dürfte es keine Probs geben...(hab das prog so überarbeitet, vielleicht hab ich ausversehen zu viel gelöscht...poste also wenns probs macht).
Code:
int n;
n = IOTools.readInteger("Anzahl der Datensätze: ");
Verpfl = new Datensatz [n];
Verpfl.Ausgaben(n);
Das hatte ich als erstesauch nicht. Heute hat jemand zu mir gemeint, ich soll das doch mal probieren...
Wir haben eine Art "Anleitung" zu den Programmen, wie wir sie programmieren müssen und da steht dann halt manchmal geschützt, manchmal nicht. Ich muss mich da halt dran halten. Manche Variablen sind auch angegeben, so wie die oben.
Ok, kenn ich....dachte nur es würde nicht so viel Sinn machen, aber wenn du es so machen "musst"....
...sonst nehmen's mir meine Tutoren nicht ab und ich muss es nochmal umschreiben...
Du meinst also, dass ich in der main dann zeigeAusgaben aufrufe und i übergebe? Und dann Verpfl.zeigeDaten() aufrufe. In zeigeDaten kann ich dann aber mit this arbeiten, oder?
Es kommt jetzt aber immer noch u.a. der Fehler "cannot resolve symbol symbol: method zeige Ausgaben(int)", dabei ist die Methode doch in der selben Klasse wie main... Ich versteh das nicht...
public static void main (String[] args)
{
int n;
double SummeAusgaben = 0;
n = IOTools.readInteger("Anzahl der Datensätze: ");
Ausgaben out = new Ausgaben(n);
for (int i=0; i<n; i++)
SummeAusgaben += out.zeigeAusgaben(i);
System.out.println("Die Summer aller Ausgaben beträgt "+SummeAusgaben+" Euro.");
Verpfl = out.sortiereAusgaben(n);
}
Anonymous hat gesagt.:
Okay, und warum hat das mit Verpfl.zeigeAusgaben(i) nicht geklappt? Er erkennt jetzt ja das out nicht... wie muss ich das dann machen?
Weil zeigeAusgaben(int i) eine Methode der Klasse Ausgabe ist und Verpfl vom Typ Datensatz ist.
Wie du oben siehst hab ich einfach ein Objekt out vom Typ Ausgaben() erzeugt. ich weiss nicht ob es so gedacht ist, aber so müsste es gehen....
Da ist vorgegeben: ...mit zwei Parametern vom Typ double und einem Rückgabewert vom Typ boolean
Ok, nur deine erste Implementierung von istBesser beinhaltete nur einen Parameter, infolgedessen wurde der Fehler wegen dem this... erzeugt. Wenn du zwei übergibst ist es ja ganz einfach...
Code:
Verpfl = Verpfl.sortiereAusgaben(n);
Da kommt auch "cannot resolve symbol"... bei istBesser auch.
Weil zeigeAusgaben(int i) eine Methode der Klasse Ausgabe ist und Verpfl vom Typ Datensatz ist.
Wie du oben siehst hab ich einfach ein Objekt out vom Typ Ausgaben() erzeugt. ich weiss nicht ob es so gedacht ist, aber so müsste es gehen....
Ah, also muss die Methode, die ich aufrufe und die Instanz, mit der ich sie aufrufe aus der gleichen Klasse sein...? Hab ich das jetzt richtig verstanden?
Okay, jetzt hat er's compiliert... ist das alles kompliziert. Nur wenn ich starte, klappt noch nicht alles. Mal schaun, ob ich das noch hinbekomme!
Eine Frage hätte ich noch bei
Code:
Ausgaben out = new Ausgaben(n);
lege ich ja eine neue Variable vom Typ Ausgaben an, in dem ich folgenden Konstruktor aufrufe:
Code:
public Ausgaben(int n){
for (int i=0; i<n; i++){
Verpfl[i] = new Datensatz();
}
}
Hm, und der wiederrum legt dann innerhalb des Feldes Verpfl n neue Datensätze an, in dem er den Kontruktor in der Klasse Datensatz aufruft, oder? Und ich hätte nicht direkt mit Verpfl den Konstruktor Ausgaben aufrufen können, weil der Konstruktor in Ausgaben ist und Verpfl vom Typ Datensatz. Stimmt das so?
Der Fehler bei Ausführen des Programms:
"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at Ausgaben.<init>(Ausgaben.java:45)
at Ausgaben.main(Ausgaben.java:94)"
heißt doch, dass an den angegebenen Stellen etwas mit der Feldlänge nicht stimmt, oder? Was genau bedeutet eigentlich die 0 in der ersten Zeile der Fehlermeldung?
Die ArrayIndexOutOfBoundsException wird ausgelöst wenn du versuchst auf ein Feldelement eines Arrays zuzugreifen welches nicht exisitiert, bzw. du gehst "über die Grenzen" des Arrays hinaus.
Habe gerade nichts da zum Testen, aber du könntest ja mal den aktuellen Stand posten, also die aktuellen Sources....
@Gast: Was willst du damit bewirken wenn du mit Verpfl den Konstruktor von Ausgaben aufrufst? Verpfl ist vom Typ Datensatz, bzw. ein Feld von Datensätzen, das hat nichts mit dem Ausgaben-Konstruktor zu tun.
Aber um die Frage zu beantworten: Nein, du hättest afaik nicht den Konstruktor mit Verpfl aufrufen können, du meinst sicherlich sowas wie zuvor im Code:
Code:
Verpfl.Ausgaben
oder?
Ich poste absichtlich nur Snippets, es bringt euch nichts wenn ich hier den Code poste. Erst bisschen selber überlegen,nur so lernt man es....
public Ausgaben(int n){
for (int i=0; i<=n; i++){
Verpfl[i] = new Datensatz(); //Konstruktor in Klasse Datensatz wird aufgerufen
}
}
und das Zeile 94:
Code:
Ausgaben out = new Ausgaben(n);
Ich habe ja die Feldlänge n, weil ich ja n Datensätze anlegen will. i muss ich dann ja von 0 bis n-1 laufen lassen, oder? Hm, die Variable out ist doch dann eine Referenz auf das Feld Verpfl, in dessen einzelnen Zellen je ein Datenatz angelegt wird, oder?
Einen Datensatz kann ich eingeben und dann kommt die Fehlermeldung...
War das schon immer so? Entweder ja oder ich hab das "automatisch" geändert Das gleich muss natürlich weg.
und das Zeile 94:
Code:
Ausgaben out = new Ausgaben(n);
Ich habe ja die Feldlänge n, weil ich ja n Datensätze anlegen will. i muss ich dann ja von 0 bis n-1 laufen lassen, oder? Hm, die Variable out ist doch dann eine Referenz auf das Feld Verpfl, in dessen einzelnen Zellen je ein Datenatz angelegt wird, oder?
Einen Datensatz kann ich eingeben und dann kommt die Fehlermeldung...
Habs gerad nochma getestet, bringt keine Fehler.
Btw. du müsstest noch überprüfen ob bei Eingabe von Tag/Monat etc. eine ungültige Eingabe erfolgt ist , z.B. 235 für Tag oder 98 für Monat etc.
Ups, nee, das war nicht immer so. Das hab ich aus Verzweiflung ausprobiert, nachdem der Fehler kam und ich nicht wusste, was falsch ist...
Hm, also bei kommt der Fehler jetzt immer noch... komisch...
Das ist jetzt mal mein Code:
Code:
import Prog1Tools.IOTools;
//Klasse Datensatz
class Datensatz{
protected double Betrag;
protected int Tag, Monat; //Datum
int Haeufigkeit;
protected String Beschreibung, Glaeubiger;
String Leerzeile1, Leerzeile2;
//Konstruktor, in dem ein neuer Datensatz angelegt wird
public Datensatz(){
Leerzeile1 = IOTools.readString("1.Leerzeile: ");
Leerzeile2 = IOTools.readString("2.Leerzeile: ");
this.Beschreibung = IOTools.readString("Beschreibung: ");
this.Glaeubiger = IOTools.readString("Glaeubiger: ");
this.Tag = IOTools.readInteger("Tag: ");
this.Monat = IOTools.readInteger("Monat: ");
this.Haeufigkeit = IOTools.readInteger("Haeufigkeit: ");
this.Betrag = IOTools.readDouble("Betrag: ");
}
public void zeigeDaten(){
System.out.println("Beschreibung: "+Beschreibung);
System.out.println("Glaeubiger: "+Glaeubiger);
System.out.println("Datum: "+this.Tag+"."+this.Monat);
System.out.println("Haeufigkeit: "+Haeufigkeit);
System.out.println("Betrag: "+this.Betrag);
}
} //Klasse Datensatz
//Klasse Ausgaben
public class Ausgaben{
static int n;
protected static Datensatz [] Verpfl = new Datensatz [n];
//Konstruktor, in dem n Datensätze angelegt und in Verpfl gespeichert werden
public Ausgaben(int n){
for (int i=0; i<n; i++){
Verpfl[i] = new Datensatz(); //Konstruktor in Klasse Datensatz wird aufgerufen
}
}
public double zeigeAusgaben(int i){
Verpfl[i].zeigeDaten();
double SummeAusgaben = Verpfl[i].Betrag*Verpfl[i].Haeufigkeit;
return SummeAusgaben;
}
public Datensatz[] sortiereAusgaben(int n){
boolean tauschen;
Datensatz speicher;
Ausgaben out = new Ausgaben(n);
for (int j=0; j<n-1; j++){
for (int i=0; i<n-1; i++){
//istBesser aufrufen
tauschen = out.istBesser(i);
if(tauschen=true){
speicher = Verpfl[i];
Verpfl[i] = Verpfl[i+1];
Verpfl[i+1] = speicher;
}//if
}//for
}//for
return Verpfl;
}//Methode
public boolean istBesser(int i){
if (Verpfl[i].Betrag*Verpfl[i].Haeufigkeit < Verpfl[i+1].Betrag*Verpfl[i+1].Haeufigkeit){
return true;
}
else{
return false;
}
}
public static void main (String[] args){
int n;
n = IOTools.readInteger("Anzahl der Datensaetze: ");
//Verpfl = new Datensatz [n];
//Verpfl.Ausgaben(n);
double SummeAusgaben = 0;
Ausgaben out = new Ausgaben(n);
for (int i=0; i<=n; i++){
SummeAusgaben += out.zeigeAusgaben(i);
}
System.out.println("Die Summer aller Ausgaben beträgt "+SummeAusgaben+" Euro.");
Verpfl = out.sortiereAusgaben(n);
SummeAusgaben = 0;
for (int i=0; i<=n; i++){
SummeAusgaben += out.zeigeAusgaben(i);
}
} //main
} //Klasse
Hab ich da jetzt wieder n total blöden Fehler drin oder warum klappt das bei mir nicht? Also, ich kann einen Datensatz einlesen und danach kommt die Fehlermeldung.
//Klasse Ausgaben
public class Ausgaben{
static int n;
protected static Datensatz [] Verpfl = new Datensatz [n];
//Konstruktor, in dem n Datensätze angelegt und in Verpfl gespeichert werden
public Ausgaben(int n){
for (int i=0; i<n; i++){
Verpfl[i] = new Datensatz(); //Konstruktor in Klasse Datensatz wird aufgerufen
}
}
Schau dir mal den Code an. n wird vom Compiler standardmäßig mit dem Wert 0 initialisiert. Das führt zu dem Fehler, da du schon oben festlegst wie groß das Array wird.
Das gehört in den Konstruktor von Ausgaben rein, die Deklaration kann draußen bleiben.
Btw. Es macht keinen Spaß Code zu lesen, in dem Variablennamen groß geschrieben sind, geht zumindest mir so...