[Java] - java.lang.ArrayIndexOutOfBoundsException : 0

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von m0mo, 16.12.2006.

  1. m0mo

    m0mo Thread Starter MacUser Mitglied

    Beiträge:
    479
    Zustimmungen:
    2
    Registriert seit:
    26.03.2005
    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
     
  2. Max02

    Max02 MacUser Mitglied

    Beiträge:
    157
    Zustimmungen:
    0
    Registriert seit:
    08.10.2004
    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.
     
  3. oneOeight

    oneOeight MacUser Mitglied

    Beiträge:
    46.803
    Zustimmungen:
    3.632
    Registriert seit:
    23.11.2004
    um so was zu vermeiden solltest du für schleifen die array length als obere grenze benutzen...
     
  4. m0mo

    m0mo Thread Starter MacUser Mitglied

    Beiträge:
    479
    Zustimmungen:
    2
    Registriert seit:
    26.03.2005
    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
     
  5. Max02

    Max02 MacUser Mitglied

    Beiträge:
    157
    Zustimmungen:
    0
    Registriert seit:
    08.10.2004
    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
     
  6. m0mo

    m0mo Thread Starter MacUser Mitglied

    Beiträge:
    479
    Zustimmungen:
    2
    Registriert seit:
    26.03.2005
    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
     
  7. Max02

    Max02 MacUser Mitglied

    Beiträge:
    157
    Zustimmungen:
    0
    Registriert seit:
    08.10.2004

    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!?
     
  8. m0mo

    m0mo Thread Starter MacUser Mitglied

    Beiträge:
    479
    Zustimmungen:
    2
    Registriert seit:
    26.03.2005
    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();
    				}
    
    			}		
    
    		}
    	}
    
     
  9. Max02

    Max02 MacUser Mitglied

    Beiträge:
    157
    Zustimmungen:
    0
    Registriert seit:
    08.10.2004
     
  10. m0mo

    m0mo Thread Starter MacUser Mitglied

    Beiträge:
    479
    Zustimmungen:
    2
    Registriert seit:
    26.03.2005
    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
     
Die Seite wird geladen...

Diese Seite empfehlen