[Java] - java.lang.ArrayIndexOutOfBoundsException : 0

m0mo

m0mo

Aktives Mitglied
Thread Starter
Dabei seit
26.03.2005
Beiträge
478
Reaktionspunkte
2
Hallo Liebe Macuser, ich hoffe ihr koennt einem totalen Javaanfaenger schnell und unkompliziert helfen:

Wen die Aufgabe interessiert, der kann sie sich hier mal anschauen:

http://www.informatik.uni-leipzig.de/~meiler/MuP.dir/MuPWS06.dir/Uebungen/Aufgabenserie9.pdf

nun erstmal der Quellcode:

PHP:
public class Wald {

	

	// Baum Klasse

	class Baum {



		//Attribute

		boolean gefaellt=false;

    }



	// Attribute

	int zeilen,spalten;

	Baum[][] baeume = new Baum[zeilen][spalten];





	public static void main (String [] args) {

	

	Wald schonung = new Wald();

	schonung.zeilen = 10;

	schonung.spalten = 10;

	

	System.out.println(schonung.spalten);



		for(int i=0;i<schonung.zeilen;i++) {

			for(int j=0;j<schonung.spalten;j++) {

				schonung.baeume[i][j].gefaellt = false; 

			}

		}

}

   

}

folgendes soll passieren: ein Wald wird erstellt und erstmal soll jeder Baum, der in einer Art Matrix definiert ist, als nicht gefaellt definiert sein, also der Wert soll fuer gefaellt = false sein.

Nun kommt beim compilieren kein Fehler, aber beim ausfuehren passiert folgendes:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at Wald.main(Wald.java:25)

woran kann das liegen? Bzw. was mache ich falsch?
Hoffe ihr koennt mir helfen, danke schonmal

mfg, m0mo
 
ein Konstruktor fehlt noch:
int zeilen, Spalten;
boolean gefaellt=false;
Baum[][] baeume;

public Baum(int zeilen, int spalten) {
baume = new Baum[zeilen][spalten];
this.gefaellt = false;
}



irgendwie so denke ich. dein problem ist das du mit schonung.baeume[j].gefaellt = false; die variable gefaellt setzen willst auf das objekt baum. nur gibt es keinen konstruktor für baum der diese membervariable hält und man somit baum.gefaellt aufrufen kann.
 
um so was zu vermeiden solltest du für schleifen die array length als obere grenze benutzen...
 
also, wenn ich das richtig verstehe, muss bei jedem arrayelement der Baum extra angelegt werden...?

Ich hab mir das ganze so vorgestellt: Ich habe 2 Klassen, Baum und Wald. In Wald definiere ich eine Art Matrix aus Baeumen mit der Zeile

Code:
Baum[][] baeume = new Baum[zeilen][spalten];

nun hat ja Max02 gesagt, das die Objekte dann nicht erstellt werden, ich dass also noch per Konstruktor machen muss. Also habe ich probiert das so zu bewerkstelligen:

Code:
public void Baum(int zeilen, int spalten) {
   baeume[zeilen][spalten] = new Baum();
   this.gefaellt = false;
}

aber natuerlich geht das auch nicht...den Konstrukor von Max02 verstehe ich leider nicht, denn warum bekommt nun auf einmal Baum[][] die matrixklammern...

bzw. : Wald schonung = new Wald(); funktioniert ja einwandfrei, und ist ja vom Prinzip eigentlich das gleiche wie das oben gewollte...oder?

hier nochmal mein kompletter Quelltext:

Code:
public class Wald {
	
	// Attribute
	int zeilen,spalten;
	Baum[][] baeume;
	
	// Methoden
	
	// toString Methode
	public String toString() {

		return "HuluHulu";
	}

        public static void main (String [] args) {
	
	Wald schonung = new Wald();
	schonung.zeilen = 10;
	schonung.spalten = 10;
	}
   
}

// Baum Klasse
class Baum {
	//Attribute
	boolean gefaellt;
}

danke nochmal fuer eure Geduld und Hilfe ;)
mfg
m0mo
 
Hallo mOmo ich hatte zuvor nicht aufgepasst. hab dir schon eine pm geschickt, aber hier nochmal:


public class Baum {

public boolean gefaellt = false;

public Baum() {
}


public boolean faellen() {
return this.gefaellt = true;
}

public String toString() {
if(gefaellt)
return "x";
else
return "o";
}
}

----------------------------------------------------------------------------------

public class Wald {

private int laenge;
private int breite;
private Baum[][] baeume;


public Wald(int laenge, int breite) {
this.laenge = laenge;
this.breite = breite;
baeume = new Baum[this.laenge][this.breite];
for(int i=0; i < baeume.length; i++) {
for(int j=0; j < baeume.length; j++) {
baeume[j] = new Baum();
}
}
}

public boolean baumFaellen(int zeile, int spalte) {
boolean b = false;
for(int i=0; i < baeume.length; i++) {
for(int j=0; j < baeume.length; j++) {
if(i == zeile-1 && j == spalte-1)
b = baeume[j].faellen();
}
}
return b;
}

public void schneiseSchlage(int schneise, boolean laengs) {

}

public int getBreite() {
return this.breite;
}

public int getLaenge() {
return this.laenge;
}

public void ausgeben() {
for(int i=0; i < baeume.length; i++) {
for(int j=0; j < baeume.length; j++) {
System.out.print(baeume[j] + " ");
}
System.out.println();
}
}

public static void main (String [] args) {

Wald schonung = new Wald(10,10);
for(int i=0; i < schonung.baeume.length; ++i) {
for(int j=0; j < schonung.baeume.length; ++j) {
System.out.print(schonung.baeume[j] + " ");
}
System.out.println();
}
System.out.println("--------------------");
schonung.baumFaellen(1, 1);
schonung.ausgeben();
}
}
-------------------------------------------------------------------------------

so denke ich geht das irgendwie
 
wow, Max02, erstmal vielen Dank:
Das einzige was ich nicht verstehe, ist folgendes:

Code:
	//Wald Attribute
        private int laenge;
	private int breite;
	private Baum[][] baeume;

	// Wald Methoden
	public Wald(int laenge, int breite) {
		this.laenge = laenge;
		this.breite = breite;
		baeume = new Baum[this.laenge][this.breite];  <-- Diese Zeile
		for(int i=0; i < baeume.length; i++) {
			for(int j=0; j < baeume[i].length; j++) { 
				baeume[i][j] = new Baum();
			}
		}	
	}

also baeume ist ja als Baum[][] definiert...also wird mit dieser Zeile eigentlich nichts weiter gemacht, als bei baeume [this.laenge][this.breite] ein Objekt Baum zu erstellen? Aber warum stehen die Klammern dann hinter Baum...hm, das peil ich nicht ganz. Der rest ist super und auch verstaendlich :)

danke schonmal

mfg
m0mo
 
m0mo schrieb:
wow, Max02, erstmal vielen Dank:
Das einzige was ich nicht verstehe, ist folgendes:

Code:
	//Wald Attribute
        private int laenge;
	private int breite;
	private Baum[][] baeume;

	// Wald Methoden
	public Wald(int laenge, int breite) {
		this.laenge = laenge;
		this.breite = breite;
		baeume = new Baum[this.laenge][this.breite];  <-- Diese Zeile
		for(int i=0; i < baeume.length; i++) {
			for(int j=0; j < baeume[i].length; j++) { 
				baeume[i][j] = new Baum();
			}
		}	
	}

also baeume ist ja als Baum[][] definiert...also wird mit dieser Zeile eigentlich nichts weiter gemacht, als bei baeume [this.laenge][this.breite] ein Objekt Baum zu erstellen? Aber warum stehen die Klammern dann hinter Baum...hm, das peil ich nicht ganz. Der rest ist super und auch verstaendlich :)

danke schonmal

mfg
m0mo


also mit Baum[][] baueme wird ein mehrdimensionales Array deklariert, das ich später verwende.
Im Konstruktor wird dieses Array dann instanziert. Also die Dimensionen des Arrays werden mit den Übergabeparametern des Konstruktors angelegt. Und das geschieht eben mit den Klammern hinter Baum(Baum bezieht sich hier auf das deklarierte Objekt baeume und nicht auf ein Objekt der Klasse Baum) Also vorsicht, hier wird noch kein Objekt Baum erzeugt nur eben das Array instanziert.
Erst mit baeume[j] = new Baum()(jetzt kommt das Objekt der Klasse Baum ins Spiel) wird an jeder Stelle des Arrays eine Objekt Baum erzeugt und geschrieben.
Ich hoffe ich konnte deine Frage beantworten!?
 
ja, konntest du :) Klasse!

nur mal schnell eine nebenher: habe gerade die schneiseschlagen methode hinzugefuegt, also die baumFaellen soweit modifiziert...aber vermutlich wollen sie sehen, dass wir die die baumFaellen Methode auch fuer die Schneiseschlagen Variante verwenden, also dann diese Methode aufrufen, richtig?

mfg
m0mo

edit: hier nochmal beide klassen...glaube aber, dass es nicht noch effizienter geht, oder?

Code:
	public boolean baumFaellen(int zeile, int spalte) {

		boolean b = false;

		for(int i=0; i < baeume.length; i++) {

			for(int j=0; j < baeume[i].length; j++) { 

				if(i == zeile-1 && j == spalte-1)

					b = baeume[i][j].faellen();

			}

		}

		return b;

	}



	public void schneiseSchlagen(int schneise, boolean laengs) {
		for(int i=0; i < baeume.length; i++) {

			for(int j=0; j < baeume[i].length; j++) { 

				if(laengs == false) {
					if (j == schneise - 1)

						baeume[i][j].faellen();

				}
				else {
					if(i == schneise - 1)
						baeume[i][j].faellen();
				}

			}		

		}
	}
 
m0mo schrieb:
ja, konntest du :) Klasse!

nur mal schnell eine nebenher: habe gerade die schneiseschlagen methode hinzugefuegt, also die baumFaellen soweit modifiziert...aber vermutlich wollen sie sehen, dass wir die die baumFaellen Methode auch fuer die Schneiseschlagen Variante verwenden, also dann diese Methode aufrufen, richtig?

mfg
m0mo

hmm, weiss nicht recht wie die das haben wollen. ich denke aber über den mehtoden aufruf schneiseSchlagen soll dies passieren. Im Klassendiagramm wurde diese Methode ja auch angegeben.
 
jagut, der aufruf der methode ist klar, nur ob ich in der methode halt auch noch baumFaellen verwende oder nicht...ich werds einfach abgeben, so wie ich es jetzt gemacht hab...hm, oder ich ueberleg mir nochmal was anderes, stell es hier rein und du sagst, welches effizienter ist ;)

mfg
m0mo
 
m0mo schrieb:
jagut, der aufruf der methode ist klar, nur ob ich in der methode halt auch noch baumFaellen verwende oder nicht...ich werds einfach abgeben, so wie ich es jetzt gemacht hab...hm, oder ich ueberleg mir nochmal was anderes, stell es hier rein und du sagst, welches effizienter ist ;)

mfg
m0mo

lass es mal so und frag lieber denn tutor ob die Aufgabgenstellung so gelöst werden soll/kann. und die klasse WaldMain fehlt noch ;o) Viel Spass weiterhin noch. In welchem Semester bekommt man solche aufgaben?
 
man bekommt solche aufgaben im 1. Semester. Problem ist: Ich studier gar nichts mit Informatik, sondern Wirtschaftsmathematik. Und der Mathe und Wirtschaftsteil ist schon ziemlich zeitintensiv, aber unsere Liebe Frau Doktorin in Modellierung und Programmierung meint, dass man ja auch mal so ein paar Stunden mit Informatik verbringen kann, weil es fuer uns ja auch so wichtig ist...

ja, Waldmain fehlt noch...da muss ich ja eine MenueMethode entwerfen. Meine Idee ist hier folgende:

Was kann getan werden:

- Schneise schlagen
- Baum faellen
- Schonung anzeigen lassen

also wuerde ich eine Methode erstellen, in der dann eine switch Abfrage steht, die die gewuenschte Aktion dann erkennt und dann die Variablen einliest und dann die Schritte ausfuehrt...+ zusaetzliche Abfrage ob die Eingaben korrekt sind. und am Ende steht dann halt noch: Weitere Aktion ausfuehren? Und dann muesste es ja funktionieren, jedenfalls hoffe ich, dass sie das mit der Methode meinen :)

ich werd mal weiterbasteln...ich zeig dann mal meine Fortschritte...:)

mfg
m0mo

edit: hm, ich seh gerade, als return soll ein int kommen...haeh? Ach verdammt, wie ich die Frau hasse...
 
also, auch nach intensivem ueberlegen faellt mir nicht ein, warum das ding ein int rausgeben sollte...ich versteh ihre idee einfach nicht - ich wuerds ganz einfach anders machen :>

jemand von euch nen klugen geistesblitz?

mfg
m0mo
 
m0mo schrieb:
also, auch nach intensivem ueberlegen faellt mir nicht ein, warum das ding ein int rausgeben sollte...ich versteh ihre idee einfach nicht - ich wuerds ganz einfach anders machen :>

jemand von euch nen klugen geistesblitz?

mfg
m0mo

vielleicht soll der rückgabewert ein quasi counter darstellen um in der commandzeile dann schonung 1, schonung 2, usw auszugeben
hmm, gibst du morgen schon ab?
 
ja, leider...das mit dem counter scheint ne moeglichkeit zu sein...nagut, dann mach ich es so. Hoffentlich :)

trotzdem schonmal danke fuer deine hilfe

mfg
m0mo
 
na dann noch gutes gelingen. mir ist es ebenso ein rätsel wieso die methode baumFällen einen boolean rückgabe wert erfordert. eine void methode wäre sinnvoller. vielleicht habe ich die aufgabenstellung falsch interpretiert, doch ich denke du hast jetzt ein lauffähiges programm welches der abbildung in der aufgabenstellung entspricht. also gut argumentieren, dann geht auch bei der abgabe nichts schief ;o)
 
Zurück
Oben Unten