ArrayOutOfBoundsException bei boolean Array

Ich verstehe nicht ganz warum ich, wenn ich versuche eine outOfBoundsException bekomme, da ich doch die Größe des Arrays aus einer Datei einlese und dann setze :(

Das ist die getestete Datei:

Code:
4
3
O#O
OO#
#OO
#O#
Und das ist meine Klasse:

Java:
import java.io.*;
import java.util.Arrays;

public class Labyrinth {

    private int playerpositionx;
    private int playerpositiony;
    private int arrayWidth;
    private int arrayLength;
    private boolean [][] gameboard = new boolean[arrayLength][arrayWidth];
    
    Labyrinth(String filename) throws IOException{
        int counter = 0, counter2 = 0, checking = 0;
        BufferedReader objReader = null;
        //try {
           String strCurrentLine;
           objReader = new BufferedReader(new FileReader(filename));
           while ((strCurrentLine = objReader.readLine()) != null) {
               System.out.println("Checking: " + checking);
               System.out.println("Counter Vertikal: " + counter);
               System.out.println("Counter Horizontal: " + counter2);
               //System.out.println(Arrays.toString(gameboard));
              
               if(checking == 0) {
                   arrayLength = Integer.parseInt(strCurrentLine);
                   System.out.println("Length: " + arrayLength);
                   checking++;
               }else if(checking == 1){
                   arrayWidth = Integer.parseInt(strCurrentLine);
                   System.out.println("Width: " + arrayWidth);
                   checking++;
               }else {
                   for(int i = 0; i < strCurrentLine.length(); i++) {
                       if(strCurrentLine.charAt(i) == 'O') {
                           gameboard[counter][counter2] = true;  //<-----
                           counter2++;
                       }
                       if(strCurrentLine.charAt(i) == '#') {
                           gameboard[counter][counter2] = false; //<-----
                           counter2++;
                       }
                   }
                   counter++;
                   counter2 = 0;
               }
               System.out.println(strCurrentLine);
           }
          
      arrayPrinter(gameboard);
      
      for(int i = 0; i < gameboard[0].length; i++) {
           if(gameboard[0][i] == true) {
               this.playerpositionx = i;
               this.playerpositiony = 0;
               break;
           }
       }
      System.out.println();
      System.out.println("Die Spielerposition ist: (" + playerpositionx + "|" + playerpositiony + ")");
      System.out.println("Das ist die Länge des Arrays: " + gameboard.length);
        
    }
    public boolean bewegeDich(char symbol){
        
        switch(symbol) {
            case 'o':
                if(playerpositiony == 0) {return false;}
                if(gameboard[playerpositiony-1][playerpositionx] == false){return false;}
                else {return true;}
                //break;
            case 'u':
                if((gameboard.length - playerpositiony) < 0) {return false;    }
                if(gameboard[playerpositiony+1][playerpositionx] == false){return false;}
                else { return true;}
                //break;
            case 'l':
                if((gameboard[0].length - playerpositionx) < 0) {return false;}
                if(gameboard[playerpositiony][playerpositionx-1] == false){return false;}
                else {return true;}
                //break;
            case 'r':
                if((gameboard[0].length - playerpositionx) < 0) {return false;}
                if(gameboard[playerpositiony][playerpositionx+1] == false){return false;}
                else {return true;}
                //break;
        }
        return false;
    }
    
    public void arrayPrinter(boolean [][] c) {
        for(boolean[] l: c) {
            for(boolean m: l) {
                System.out.print(m + " | ");
            }
            System.out.println();
        }
    }
    
    @Override
    public String toString() {
        String result = "";
        for(int i = 0; i < gameboard.length; i++) {
            for(int j = 0; j < gameboard[i].length; j++) {
                if(gameboard[i][j] == true && i != playerpositiony && j != playerpositionx) {
                    result += "O";
                }else if(gameboard[i][j] == true && i == playerpositiony && j == playerpositionx){
                    result += "x";
                }else if(gameboard[i][j] == false) {
                    result += "#";
                }
            }
            result += "\n";
        }
        return result;
    }
}
 
Äh, lass mal, Du prüfst ja vorher ab, ob es sich um ein '#' oder '0' handelt... An welcher Stelle bekommst Du denn die Exception?
 
Habe geschaut, aber es hat die Länge 3, also keine Leerzeichen :( Liegt wahrscheinlich an meinen Counter Variablen, jedoch verstehe ich nicht ganz wieso xD

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at Labyrinth.<init>(Labyrinth.java:36)
 
Danke es geht xD Jetzt fühle ich mich verarscht hahaha ich dachte ich habe irgendeine besondere Exception bei 2D Arrays nicht bedacht xD
 
Und verwende try-with-resources - auch, wenn Du keinen catch-Block hast. Ich würde das auch etwas anders schreiben:

Java:
        try(BufferedReader objReader = new BufferedReader(new FileReader(filename))) {
            arrayLength = Integer.parseInt(objReader.readLine());
            arrayWidth = Integer.parseInt(objReader.readLine());

            gameboard = new boolean[arrayLength][arrayWidth];

            for (int i = 0; i < arrayLength; i++) {
                String strCurrentLine = objReader.readLine();

                for (int k = 0; k < strCurrentLine.length(); k++) {
                    gameboard[i][k] = strCurrentLine.charAt(k) == 'O';
                }
            }
        }
 
Mal eine blöde Frage aber wie weiß das Programm in deinem Code, dass er nach einlesen von arrayLength eine Zeile weiter gehen soll?

Oder jumpt readLine sofort in die nächste Zeile?

Ich hatte erst einen catch block, jedoch wird in der Test Klasse der Uni keine Exception geworfen und ich kann diese nicht anpassen :(
 
in der Test Klasse der Uni
Oh, da musst Du allerdings aufpassen, ob Du zusätzliche Prüfungen brauchst (z. B. vorzeitiges Dateieende, falsche Zeichen in der Datei, ungültige Zeilenlänge etc.)

Mein Code geht einfach davon aus, dass die Datei in Ordnung ist. Enthält die Datei z. B. mehr Zeilen als anfangs angegeben, interessiert das meinen Code nicht. Enthält sie weniger, kommt es automatisch zu einer NullPointerException. Auch interessiert den Code nicht, welches Zeichen für false verwendet wird.
 
Also ich habe noch einmal in die Aufgabenstellung geschaut und dort steht dass man davon ausgehen kann dass alle Datei im richtigen Format sind...naja in meinen Augen hätte ich trotzdem gerne einen try catch block eingefügt um auch gegen den "DAU" zu punkten xD
 
Okii :) Also ich habe den Code auch mehr oder weniger fertig xD Hab noch ein paar Exceptions in der bewegeDich Methode aber das liegt daran dass man um 2 Uhr nachts sich sehr gut konzentrieren kann kappa xD
 
Dieser Moment wenn man seinen eigenen Code durchgeht und man sich fragt ob man eigentlich komplett dumm ist hahaha :) Ich habe solche idiotischen Fehler entdeckt xD
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben