Probleme mit Instanzmethoden / Klassen

Status
Nicht offen für weitere Antworten.
S

Simone

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

Wäre über Hilfe echt sehr dankbar!
 

mic_checker

Top Contributor
Simone hat gesagt.:
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.

Wäre über Hilfe echt sehr dankbar!

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

Simone

Gast
Also, mein Code sieht folgendermaßen aus:
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{ 
		
		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();
			double SumAusg = this.Betrag*this.Haeufigkeit;
			return SumAusg;
		}
		
		public Datensatz[] sortiereAusgaben(int n){
			boolean tauschen;
			Datensatz speicher;
			for (int j=0; j<n-1; j++){
				for (int i=0; i<n-1; i++){
					//istBesser aufrufen
					tauschen = Verpfl[i].istBesser(Verpfl[i+1]);
					if(tauschen=true){
						speicher = Verpfl[i];
						Verpfl[i] = Verpfl[i+1];
						Verpfl[i+1] = speicher;
					}//if
				}//for
			}//for
			return Verpfl;
			
		}//Methode
		
		
		public boolean istBesser(Datensatz Verpfl2){
			if (this.Betrag*this.Haeufigkeit < Verpfl2.Betrag*Verpfl2.Haeufigkeit){
				return true;
			}
			else{
				return false;
			}
		}
		
		public void main (String[] args){
			int n;
			n = IOTools.readInteger("Anzahl der Datensätze: ");
			
			Verpfl = new Datensatz [n];
			
			Verpfl.Ausgaben(n);
			
			double SummeAusgaben = 0;
			
			for (int i=0; i<n; i++){
				double SumAusg = Verpfl[i].zeigeAusgaben();  				                                SummeAusgaben = SummeAusgaben + SumAusg;
			}
			System.out.println("Die Summer aller Ausgaben beträgt "+SummeAusgaben+" Euro.");
			
			Verpfl = Verpfl.sortiereAusgaben(n);
			
			SummeAusgaben = 0;
			
			for (int i=0; i<n; i++){
				double SumAusg = Verpfl[i].zeigeAusgaben();					                SummeAusgaben = SummeAusgaben + SumAusg;
			}
			
		} //main
		
	} //Klasse

Schonmal danke!
 

mic_checker

Top Contributor
Simone hat gesagt.:
Also, mein Code sieht folgendermaßen aus:
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{ 
		
		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();

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

mic_checker

Top Contributor
Simone hat gesagt.:
Also, mein Code sieht folgendermaßen aus:
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;

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

Code:
			double SumAusg = this.Betrag*this.Haeufigkeit;
			return SumAusg;
		}

Wieder selber Fehler. Betrag und Haeufigkeit sind in Datensatz deklariert, nicht in Ausgaben.

Code:
		public Datensatz[] sortiereAusgaben(int n){
			boolean tauschen;
			Datensatz speicher;
			for (int j=0; j<n-1; j++){
				for (int i=0; i<n-1; i++){
					//istBesser aufrufen
					tauschen = Verpfl[i].istBesser(Verpfl[i+1]);
					if(tauschen=true){
						speicher = Verpfl[i];
						Verpfl[i] = Verpfl[i+1];
						Verpfl[i+1] = speicher;
					}//if
				}//for
			}//for
			return Verpfl;
			
		}//Methode		
		
		public boolean istBesser(Datensatz Verpfl2){
			if (this.Betrag*this.Haeufigkeit < Verpfl2.Betrag*Verpfl2.Haeufigkeit){
				return true;
			}
			else{
				return false;
			}
		}

Bin jetzt die Schleife nicht genau durchgegangen, aber vielleicht wäre es besser die Methode istBesser() in Datensatz zu implementieren?

Fehler mit this....muss ich wohl nicht mehr erläutern.

Code:
		public void main (String[] args){

Code:
public static void main (String[] args)

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

Code:
			double SummeAusgaben = 0;
			
			for (int i=0; i<n; i++){
				double SumAusg = Verpfl[i].zeigeAusgaben();  				                                SummeAusgaben = SummeAusgaben + SumAusg;
			}

Schau dir mal += "Operator" an....

In deinem Code sind noch einige Unstimmigkeiten.....bei weiteren Problemen -> post
 
G

Guest

Gast
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;

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

Code:
			double SumAusg = this.Betrag*this.Haeufigkeit;
			return SumAusg;
		}


Wieder selber Fehler. Betrag und Haeufigkeit sind in Datensatz deklariert, nicht in Ausgaben.

Okay, das passt jetzt, wenn ich das mit Verpfl mache und i übergeb. Danke!

Code:
		public Datensatz[] sortiereAusgaben(int n){
			boolean tauschen;
			Datensatz speicher;
			for (int j=0; j<n-1; j++){
				for (int i=0; i<n-1; i++){
					//istBesser aufrufen
					tauschen = Verpfl[i].istBesser(Verpfl[i+1]);
					if(tauschen=true){
						speicher = Verpfl[i];
						Verpfl[i] = Verpfl[i+1];
						Verpfl[i+1] = speicher;
					}//if
				}//for
			}//for
			return Verpfl;
			
		}//Methode		
		
		public boolean istBesser(Datensatz Verpfl2){
			if (this.Betrag*this.Haeufigkeit < Verpfl2.Betrag*Verpfl2.Haeufigkeit){
				return true;
			}
			else{
				return false;
			}
		}

Bin jetzt die Schleife nicht genau durchgegangen, aber vielleicht wäre es besser die Methode istBesser() in Datensatz zu implementieren?

Fehler mit this....muss ich wohl nicht mehr erläutern.

Ich muss die Methode istBesser in die Klasse Ausgaben schreiben...

Code:
		public void main (String[] args){

Code:
public static void main (String[] args)

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

Das hatte ich als erstesauch nicht. Heute hat jemand zu mir gemeint, ich soll das doch mal probieren...

Code:
			double SummeAusgaben = 0;
			
			for (int i=0; i<n; i++){
				double SumAusg = Verpfl[i].zeigeAusgaben();  				                                SummeAusgaben = SummeAusgaben + SumAusg;
			}

Schau dir mal += "Operator" an....

Hm, den mag ich nicht so... =)

Puh, ist das alles kompliziert...
 

mic_checker

Top Contributor
Anonymous hat gesagt.:
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...


In main die for-Schleife könnte so aussehen:

Code:
		double SummeAusgaben = 0;
         ......
		for (int i=0; i<n; i++)
      	SummeAusgaben += out.zeigeAusgaben(i);

Dabei sieht die Methode zeigeAusgaben() dann so aus:

Code:
   public double zeigeAusgaben(int i)
   {
		Verpfl[i].zeigeDaten();
      double sumAusg = Verpfl[i].betrag * Verpfl[i].haeufigkeit;
         
      return sumAusg;
   }

Weiss nicht ob du es so willst, so müsste es aber klappen...


Ich muss die Methode istBesser in die Klasse Ausgaben schreiben...

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

Also ich weiss nun wirklich nicht was das soll....

Es würde Sinn machen ein Ausgaben Objekt zu erzeugen, aber das säh dann ja ganz anders aus vom Code her....

Hm, den mag ich nicht so... =)

Puh, ist das alles kompliziert...

Ich bin sonst schreibfaul -> ergo: ich mag den ;)
 
G

Guest

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

In main die for-Schleife könnte so aussehen:

Code:
		double SummeAusgaben = 0;
         ......
		for (int i=0; i<n; i++)
      	SummeAusgaben += out.zeigeAusgaben(i);


Okay, und warum hat das mit Verpfl.zeigeAusgaben(i) nicht geklappt? Er erkennt jetzt ja das out nicht... wie muss ich das dann machen?

Ich muss die Methode istBesser in die Klasse Ausgaben schreiben...


Ok - ist die Methode so vergegeben? Also mit dieser Signatur ? (soll heissen Rückgabewert,Parameter etc.) ?

Da ist vorgegeben: ...mit zwei Parametern vom Typ double und einem Rückgabewert vom Typ boolean


Code:
Verpfl = Verpfl.sortiereAusgaben(n);
Da kommt auch "cannot resolve symbol"... bei istBesser auch.

In der for-Schleife in der main kommt bei
Code:
SummeAusgaben = out.zeigeAusgaben(i);
der Fehler inconvertible types, found: Java.lang.String, required: double
Was muss ich da machen?

Ich muss mir das ganze morgen nochmal genau anschauen. Ist schon spät =)
 

mic_checker

Top Contributor
DIe main könnte momentan so aussehen:

Code:
	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.
schau code oben ma an...

In der for-Schleife in der main kommt bei

Code:
SummeAusgaben = out.zeigeAusgaben(i);

der Fehler inconvertible types, found: Java.lang.String, required: double

Was muss ich da machen?

SummeAusgaben ist doch ein double...zeigeAusgaben gibt ein double zurück, dürfte bei richtiger Implementierung also keine Probleme verursachen...
 
G

Guest

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

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?

Danke nochmal!
 
S

Simone

Gast
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?
 

mic_checker

Top Contributor
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....
 
S

Simone

Gast
Also, das ist Zeile 45ff:
Code:
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...
 

mic_checker

Top Contributor
Simone hat gesagt.:
Also, das ist Zeile 45ff:
Code:
public Ausgaben(int n){
			for (int i=0; i<=n; i++){ 
				Verpfl[i] = new Datensatz();	//Konstruktor in Klasse Datensatz wird aufgerufen
			}
		}

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

Es ist eine Referenz auf ein Objekt vom Typ Ausgabe, in dem Konstruktor wird ein Array von Objekten der Klasse Datensatz angelegt.
 

mic_checker

Top Contributor
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.
 
G

Guest

Gast
Also, das ist Zeile 45ff:
Code:
public Ausgaben(int n){
			for (int i=0; i<=n; i++){ 
				Verpfl[i] = new Datensatz();	//Konstruktor in Klasse Datensatz wird aufgerufen
			}
		}

War das schon immer so? Entweder ja oder ich hab das "automatisch" geändert ;) Das gleich muss natürlich weg.

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.
 

mic_checker

Top Contributor
Anonymous hat gesagt.:
Code:
	//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...
 

mic_checker

Top Contributor
Kein Problem, denk noch dran eine Überprüfung bei der Eingabe der Daten zu implementieren, sonst erlaubst du es noch jemandem Sachen einzugeben wie:

Tag: 2823
Monat: 23232323

etc. pp.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Probleme bei Verwendung short und int im Constuctor Java Basics - Anfänger-Themen 6
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
P Probleme mit NetBeans: Wie lässt sich jar. Datei an einem MacBook öffnen Java Basics - Anfänger-Themen 21
I Projekte in IDE untereinander sharen / Probleme beim Build Java Basics - Anfänger-Themen 8
MiMa Probleme mit Datentyp long ?? Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
B Quiz mit RMI Probleme mit RMI start Java Basics - Anfänger-Themen 4
httprt Probleme bei dem erstellen von leveln in meinem Spiel Java Basics - Anfänger-Themen 2
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
V Probleme Guessing Game Java Basics - Anfänger-Themen 8
hebein PDF Ausdruck auf Drucker - Probleme mit Format Java Basics - Anfänger-Themen 17
R JMenu/JMenuItem Probleme Java Basics - Anfänger-Themen 2
B Static vs non static und Probleme daraus Java Basics - Anfänger-Themen 13
J Probleme mit dem Debugger Java Basics - Anfänger-Themen 4
I Probleme mit OutputStream - Datei lässt sich nicht öffnen Java Basics - Anfänger-Themen 4
J Probleme mit Kompilierung Java Basics - Anfänger-Themen 11
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
C Probleme mit paintComponent Java Basics - Anfänger-Themen 13
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
E JavaFX Editor Probleme mit der Zwischenablage Java Basics - Anfänger-Themen 12
C Probleme mit dem Erstellen und Importieren von Packages Java Basics - Anfänger-Themen 6
3 OOP erste Versuche, OOP zu verstehen. Probleme mit gettern und settern Java Basics - Anfänger-Themen 4
R Erste Schritte Probleme bei 2D Spielfeld, mit einzufügender "Person" Java Basics - Anfänger-Themen 5
P Probleme bei der Installation von JavaFX Java Basics - Anfänger-Themen 3
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
D Probleme mit JFrame und der Größe Java Basics - Anfänger-Themen 8
Dimax String Probleme Java Basics - Anfänger-Themen 12
N Probleme beim printen von Arrays durch for Schleife Java Basics - Anfänger-Themen 3
Splayfer Java Array Probleme Java Basics - Anfänger-Themen 3
J Probleme bei IllegalArgumentException "werfen". Java Basics - Anfänger-Themen 1
K Probleme bei der Ausgabe - komme nicht weiter :/ Java Basics - Anfänger-Themen 15
X Probleme im Umgang mit PriorityQueue Java Basics - Anfänger-Themen 75
D Probleme mit dem Windowbuilder und JComboBox Java Basics - Anfänger-Themen 2
M Regex Probleme (mal wieder) Java Basics - Anfänger-Themen 3
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
X Probleme mit Übungsaufgaben zu Zahlentypen Java Basics - Anfänger-Themen 4
G Probleme bei Aufgabe Java Basics - Anfänger-Themen 12
P Erste Schritte Probleme mit dem Programmieren Java Basics - Anfänger-Themen 12
B Probleme bei einer Aufgabe Java Basics - Anfänger-Themen 19
Franzi1001 Probleme mit Eclipse Java Basics - Anfänger-Themen 7
T Probleme bei Installation von JDK Java Basics - Anfänger-Themen 2
C Probleme mit String-Vergleich Java Basics - Anfänger-Themen 4
C Probleme bei Regex Java Basics - Anfänger-Themen 9
V Probleme mit Arrays Java Basics - Anfänger-Themen 8
D Kleine Probleme mit Split-Befehlen Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
G Probleme bei Frame aufgaben Java Basics - Anfänger-Themen 6
N Probleme mit dem ActionListener Java Basics - Anfänger-Themen 4
D Probleme beim Kompelieren mache ich etwas falsch ? Java Basics - Anfänger-Themen 3
L Probleme mit Java Java Basics - Anfänger-Themen 3
S Probleme mit abspielen einer .wav Datei Java Basics - Anfänger-Themen 2
J Probleme bei der Umwandlung einer Farbe von Hex zu RGB Java Basics - Anfänger-Themen 8
K Probleme beim Programm schreiben - Lesen von Dateiinhalten -zaehlen von Wörtern/ Buchstaben Java Basics - Anfänger-Themen 4
M Probleme beim aktualisieren eines JPanels Java Basics - Anfänger-Themen 7
J Probleme beim Array ausgeben Java Basics - Anfänger-Themen 4
M Probleme bei rekursiver Zuordnung Java Basics - Anfänger-Themen 1
I Probleme mit 2 dimensionale Arrays Java Basics - Anfänger-Themen 3
H Best Practice View probleme Java Basics - Anfänger-Themen 2
B Probleme mit Kreisberechnung Java Basics - Anfänger-Themen 15
E Probleme mit Scanner Java Basics - Anfänger-Themen 4
J Eclipse Export Probleme Java Basics - Anfänger-Themen 25
M Probleme beim verwenden von Packages Java Basics - Anfänger-Themen 6
D Probleme mit der Übergabe einer BorderPane Java Basics - Anfänger-Themen 2
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
BlueFox Tabelle in der Konsole ausgeben - Probleme Java Basics - Anfänger-Themen 1
G Methoden Probleme beim Methodenaufruf Java Basics - Anfänger-Themen 2
V Klassen ObjectInputStream ->ReadObject Probleme Java Basics - Anfänger-Themen 5
P Probleme mit der Do-Schleife Java Basics - Anfänger-Themen 2
F Erste Schritte Compiling Probleme Java Basics - Anfänger-Themen 13
S Neuling und Probleme bei Schulaufgabe Java Basics - Anfänger-Themen 5
J Anfänger: ActionListener und ProcessBuilder machen Probleme Java Basics - Anfänger-Themen 6
S Erste Schritte 2D Grafik Probleme mit KeyListener. Java Basics - Anfänger-Themen 18
M Array mit eigenem Datentyp probleme beim übergeben Java Basics - Anfänger-Themen 6
M Probleme mit Eclipse Java Basics - Anfänger-Themen 20
G Probleme beim casten von double zu int Java Basics - Anfänger-Themen 3
E 2 Probleme - Datum & private finale Variablen Java Basics - Anfänger-Themen 5
S Compiler-Fehler javac hat Probleme mit Paketen unter OSX Java Basics - Anfänger-Themen 2
J Probleme beim schreiben von Dateien Java Basics - Anfänger-Themen 5
B Variablen Probleme mit Eclipse Java Basics - Anfänger-Themen 6
H Mouse- und KeyListener Probleme? Java Basics - Anfänger-Themen 5
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
I Probleme bei Verzeichnissanalyse Java Basics - Anfänger-Themen 12
F Probleme mit privaten Klassen (abstrakten Klassen) Java Basics - Anfänger-Themen 1
H Probleme mit Klassen...oder: Eine Uhr Java Basics - Anfänger-Themen 9
G Probleme mit Konsole Java Basics - Anfänger-Themen 4
S Probleme mit GamGrid Spiel-Erstellung => Actor reagiert nicht auf Tastatur Java Basics - Anfänger-Themen 2
G Probleme mit Eclipse oder der URL Klasse Java Basics - Anfänger-Themen 5
W Verständnis Probleme bei der while-Schleife und continue Java Basics - Anfänger-Themen 21
M Probleme mit Anzeigen von String in GUI und if-Anweisung Java Basics - Anfänger-Themen 9
T Konstruktor Probleme Java Basics - Anfänger-Themen 3
W Methoden Probleme mit der Scanner Methode Java Basics - Anfänger-Themen 2
F Ja Nein Abfrage und andere Probleme Java Basics - Anfänger-Themen 5
L If Anweisung mit ArrayList Probleme Java Basics - Anfänger-Themen 6
littles_de Simbad Simulator probleme mit Sensordaten... Java Basics - Anfänger-Themen 0
M Erste Schritte Probleme beim Verknüpfen von Methoden Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben