java.lang.ArrayIndexOutOfBoundsException

JaVaN0oB

Mitglied
Hallöchen 🙂
Ich habe wieder mal ein neues Problem.
Aufgabe ist es dieses Mal, ein Labyrinth aus einer Datei einzulesen und dass ich mich quasi darin bewegen kann.

Ich habe mir mal den Post von @Kirby.exe angeguckt und mal den Code als Vorlage benutzt.
Leider komme ich aber nicht mehr weiter, da ich folgenden Fehler immer wieder bekomme:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1

Könnt ihr helfen? Programmieren fällt mir alles andere als leicht und ich komme da leider nie so wirklich mit...
Vielen Dank schon einmal an der Stelle.

So sieht es aktuell aus:


[CODE lang="java" title="Labyrinth.java"]import java.io.*;
import java.util.Arrays;

public class Labyrinth {

private int spielerpositionx;
private int spielerpositiony;
private int arrayWidth;
private int arrayLength;
private boolean [][] laybrinth; //= new boolean[arrayLength][arrayWidth];

Labyrinth(String datei) throws IOException{
int counter = 0, counter2 = 0, checking = 0;
BufferedReader in = new BufferedReader(new FileReader(datei));
//try {System.out.println("Test");
String strCurrentLine;
String[] parts = in.readLine().split(" ");
laybrinth = new boolean[Integer.parseInt(parts[0])][Integer.parseInt(parts[1])];

while ((strCurrentLine = in.readLine()) != null) {
for(int i = 0; i < strCurrentLine.length(); i++) {
if(strCurrentLine.charAt(i) == 'O') {
laybrinth[counter][counter2] = true; //<-----
counter2++;
}
if(strCurrentLine.charAt(i) == '#') {
laybrinth[counter][counter2] = false; //<-----
counter2++;
}
}
counter++;
counter2 = 0;
}
System.out.println(strCurrentLine);


arrayPrinter(laybrinth);

for(int i = 0; i < laybrinth[0].length; i++) {
if(laybrinth[0] == true) {
this.spielerpositionx = i;
this.spielerpositiony = 0;
break;
}
}
System.out.println();
System.out.println("Die Spielerposition ist: (" + spielerpositionx + "|" + spielerpositiony + ")");
System.out.println("Das ist die Länge des Arrays: " + laybrinth.length);

}

public boolean bewegeDich(char symbol){

switch(symbol) {
case 'o':
if(spielerpositiony == 0) {return false;}
if(laybrinth[spielerpositiony-1][spielerpositionx] == false){return false;}
else {return true;}
//break;
case 'u':
if((laybrinth.length - spielerpositiony) < 0) {return false; }
if(laybrinth[spielerpositiony+1][spielerpositionx] == false){return false;}
else { return true;}
//break;
case 'l':
if((laybrinth[0].length - spielerpositionx) < 0) {return false;}
if(laybrinth[spielerpositiony][spielerpositionx-1] == false){return false;}
else {return true;}
//break;
case 'r':
if((laybrinth[0].length - spielerpositionx) < 0) {return false;}
if(laybrinth[spielerpositiony][spielerpositionx+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 < laybrinth.length; i++) {
for(int j = 0; j < laybrinth.length; j++) {
if(laybrinth[j] == true && i != spielerpositiony && j != spielerpositionx) {
result += "O";
}else if(laybrinth[j] == true && i == spielerpositiony && j == spielerpositionx){
result += "x";
}else if(laybrinth[j] == false) {
result += "#";
}
}
result += "\n";
}
return result;
}
}[/CODE]

[CODE lang="java" title="LabyrinthTest.java [READONLY]"]import java.io.*;
public class LabyrinthTest {
public static void main(String[] args) throws IOException {
Labyrinth[] lab = new Labyrinth[args.length];
for(int i=0; i<args.length; i++) {
lab = new Labyrinth(args);
}
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
char eingabe;
while((eingabe = in.readLine().charAt(0))!='e') {
switch(eingabe) {
case 'u':
case 'o':
case 'l':
case 'r':
for(int i=0; i<lab.length; i++)
System.out.println(lab.bewegeDich(eingabe));
break;
case 'a':
for(int i=0; i<lab.length; i++)
System.out.println(lab);
break;
}
}
}
}[/CODE]
 
Alternativ hätte ich noch das im Angebot:

[CODE lang="java" title="Labyrinth.java"]import java.io.*;
import java.util.Arrays;

public class Labyrinth {

private int spielerpositionx;
private int spielerpositiony;
private int arrayWidth;
private int arrayLength;
private boolean [][] labyrinth; //= new boolean[arrayLength][arrayWidth];

Labyrinth(String datei) throws IOException{
int counter = 0, counter2 = 0, checking = 0;
try(BufferedReader in = new BufferedReader(new FileReader(datei))) {
arrayLength = Integer.parseInt(in.readLine());
arrayWidth = Integer.parseInt(in.readLine());

labyrinth = new boolean[arrayLength][arrayWidth];

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

for (int k = 0; k < strCurrentLine.length(); k++) {
labyrinth[k] = strCurrentLine.charAt(k) == 'O';
}
}
}


arrayPrinter(labyrinth);

for(int i = 0; i < labyrinth[0].length; i++) {
if(labyrinth[0] == true) {
this.spielerpositionx = i;
this.spielerpositiony = 0;
break;
}
}
System.out.println();
System.out.println("Die Spielerposition ist: (" + spielerpositionx + "|" + spielerpositiony + ")");
System.out.println("Das ist die Länge des Arrays: " + labyrinth.length);

}

public boolean bewegeDich(char symbol){

switch(symbol) {
case 'o':
if(spielerpositiony == 0) {return false;}
if(labyrinth[spielerpositiony-1][spielerpositionx] == false){return false;}
else {return true;}
//break;
case 'u':
if((labyrinth.length - spielerpositiony) < 0) {return false; }
if(labyrinth[spielerpositiony+1][spielerpositionx] == false){return false;}
else { return true;}
//break;
case 'l':
if((labyrinth[0].length - spielerpositionx) < 0) {return false;}
if(labyrinth[spielerpositiony][spielerpositionx-1] == false){return false;}
else {return true;}
//break;
case 'r':
if((labyrinth[0].length - spielerpositionx) < 0) {return false;}
if(labyrinth[spielerpositiony][spielerpositionx+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 < labyrinth.length; i++) {
for(int j = 0; j < labyrinth.length; j++) {
if(labyrinth[j] == true && i != spielerpositiony && j != spielerpositionx) {
result += "O";
}else if(labyrinth[j] == true && i == spielerpositiony && j == spielerpositionx){
result += "x";
}else if(labyrinth[j] == false) {
result += "#";
}
}
result += "\n";
}
return result;
}
}[/CODE]

Aber auch hier kommt dann ein Fehler.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2
 
Bei diesem
Alternativ hätte ich noch das im Angebot:

[CODE lang="java" title="Labyrinth.java"]import java.io.*;
import java.util.Arrays;

public class Labyrinth {

private int spielerpositionx;
private int spielerpositiony;
private int arrayWidth;
private int arrayLength;
private boolean [][] labyrinth; //= new boolean[arrayLength][arrayWidth];

Labyrinth(String datei) throws IOException{
int counter = 0, counter2 = 0, checking = 0;
try(BufferedReader in = new BufferedReader(new FileReader(datei))) {
arrayLength = Integer.parseInt(in.readLine());
arrayWidth = Integer.parseInt(in.readLine());

labyrinth = new boolean[arrayLength][arrayWidth];

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

for (int k = 0; k < strCurrentLine.length(); k++) {
labyrinth[k] = strCurrentLine.charAt(k) == 'O';
}
}
}


arrayPrinter(labyrinth);

for(int i = 0; i < labyrinth[0].length; i++) {
if(labyrinth[0] == true) {
this.spielerpositionx = i;
this.spielerpositiony = 0;
break;
}
}
System.out.println();
System.out.println("Die Spielerposition ist: (" + spielerpositionx + "|" + spielerpositiony + ")");
System.out.println("Das ist die Länge des Arrays: " + labyrinth.length);

}

public boolean bewegeDich(char symbol){

switch(symbol) {
case 'o':
if(spielerpositiony == 0) {return false;}
if(labyrinth[spielerpositiony-1][spielerpositionx] == false){return false;}
else {return true;}
//break;
case 'u':
if((labyrinth.length - spielerpositiony) < 0) {return false; }
if(labyrinth[spielerpositiony+1][spielerpositionx] == false){return false;}
else { return true;}
//break;
case 'l':
if((labyrinth[0].length - spielerpositionx) < 0) {return false;}
if(labyrinth[spielerpositiony][spielerpositionx-1] == false){return false;}
else {return true;}
//break;
case 'r':
if((labyrinth[0].length - spielerpositionx) < 0) {return false;}
if(labyrinth[spielerpositiony][spielerpositionx+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 < labyrinth.length; i++) {
for(int j = 0; j < labyrinth.length; j++) {
if(labyrinth[j] == true && i != spielerpositiony && j != spielerpositionx) {
result += "O";
}else if(labyrinth[j] == true && i == spielerpositiony && j == spielerpositionx){
result += "x";
}else if(labyrinth[j] == false) {
result += "#";
}
}
result += "\n";
}
return result;
}
}[/CODE]

Aber auch hier kommt dann ein Fehler.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2


at Labyrinth.bewegeDich(Labyrinth.java:65)
at LabyrinthTest.main(LabyrinthTest.java:17)

Ansonsten im Originalpost
at Labyrinth.<init>(Labyrinth.java:18)
at LabyrinthTest.main(LabyrinthTest.java:6)
 
Der Großteil deines Switches ist nämlich falsch und schließt nicht alle Randfälle aus 😉

So sollte die Randbehandlung aussehen:

Java:
switch(symbol) {
            case 'o':
                if(playerpositiony == 0) {return false;}
                if(labyrinth[playerpositiony-1][playerpositionx] == false){return false;}
                else {playerpositiony -= 1; return true;}
            case 'u':
                if((labyrinth.length-1) == playerpositiony) {return false;}
                if(labyrinth[playerpositiony+1][playerpositionx] == false){return false;}
                else {playerpositiony += 1; return true;}
            case 'l':
                if(playerpositionx == 0) {return false;}
                if(labyrinth[playerpositiony][playerpositionx-1] == false){return false;}
                else {playerpositionx -= 1;return true;}
            case 'r':
                if((labyrinth[playerpositiony].length-1) == playerpositionx) {return false;}
                if(labyrinth[playerpositiony][playerpositionx+1] == false){return false;}
                else {playerpositionx += 1; return true;}
        }
 
[CODE lang="java" title="Labyrinth.java"]import java.io.*;
import java.util.Arrays;

public class Labyrinth {

private int spielerpositionx;
private int spielerpositiony;
private int arrayWidth;
private int arrayLength;
private boolean [][] labyrinth; //= new boolean[arrayLength][arrayWidth];

Labyrinth(String datei) throws IOException{
int counter = 0, counter2 = 0, checking = 0;
try(BufferedReader in = new BufferedReader(new FileReader(datei))) {
arrayLength = Integer.parseInt(in.readLine());
arrayWidth = Integer.parseInt(in.readLine());

labyrinth = new boolean[arrayLength][arrayWidth];

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

for (int k = 0; k < strCurrentLine.length(); k++) {
labyrinth[k] = strCurrentLine.charAt(k) == 'O';
}
}
}


arrayPrinter(labyrinth);

for(int i = 0; i < labyrinth[0].length; i++) {
if(labyrinth[0] == true) {
this.spielerpositionx = i;
this.spielerpositiony = 0;
break;
}
}
System.out.println();
System.out.println("Die Spielerposition ist: (" + spielerpositionx + "|" + spielerpositiony + ")");
System.out.println("Das ist die Länge des Arrays: " + labyrinth.length);

}

public boolean bewegeDich(char symbol){

switch(symbol) {
case 'o':
if(spielerpositiony == 0) {return false;}
if(labyrinth[spielerpositiony-1][spielerpositionx] == false){return false;}
else {spielerpositiony -= 1; return true;}
case 'u':
if((labyrinth.length-1) == spielerpositiony) {return false;}
if(labyrinth[spielerpositiony+1][spielerpositionx] == false){return false;}
else {spielerpositiony += 1; return true;}
case 'l':
if(spielerpositionx == 0) {return false;}
if(labyrinth[spielerpositiony][spielerpositionx-1] == false){return false;}
else {spielerpositionx -= 1;return true;}
case 'r':
if((labyrinth[spielerpositiony].length-1) == spielerpositionx) {return false;}
if(labyrinth[spielerpositiony][spielerpositionx+1] == false){return false;}
else {spielerpositionx += 1; return true;}
}
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 < labyrinth.length; i++) {
for(int j = 0; j < labyrinth.length; j++) {
if(labyrinth[j] == true && i != spielerpositiony && j != spielerpositionx) {
result += "O";
}else if(labyrinth[j] == true && i == spielerpositiony && j == spielerpositionx){
result += "x";
}else if(labyrinth[j] == false) {
result += "#";
}
}
result += "\n";
}
return result;
}
}[/CODE]

So sieht es jetzt aus, danke!
Nur sind jetzt die Ausgaben immer irgendwie um eine Instanz verspätet...
 
Also erstmal, musst du alle nicht geforderten Prints auskommentierst oder löschst 😉 Des weiteren erwartet hier YAPEX eine Zeilenweise Ausgabe der Matrix 😉 Somit darfst du nicht den ganzen String konstruieren sondern nach jeder Zeile printen 😉
 
[CODE lang="java" title="UPDATE"]import java.io.*;
import java.util.Arrays;

public class Labyrinth {

private int spielerpositionx;
private int spielerpositiony;
private int arrayWidth;
private int arrayLength;
private boolean [][] labyrinth; //= new boolean[arrayLength][arrayWidth];

Labyrinth(String datei) throws IOException{
int counter = 0, counter2 = 0, checking = 0;
try(BufferedReader in = new BufferedReader(new FileReader(datei))) {
arrayLength = Integer.parseInt(in.readLine());
arrayWidth = Integer.parseInt(in.readLine());

labyrinth = new boolean[arrayLength][arrayWidth];

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

for (int k = 0; k < strCurrentLine.length(); k++) {
labyrinth[k] = strCurrentLine.charAt(k) == 'O';
}
}
}

for(int i = 0; i < labyrinth[0].length; i++) {
if(labyrinth[0] == true) {
this.spielerpositionx = i;
this.spielerpositiony = 0;
break;
}
}

}

public boolean bewegeDich(char symbol){

switch(symbol) {
case 'o':
if(spielerpositiony == 0) {return false;}
if(labyrinth[spielerpositiony-1][spielerpositionx] == false){return false;}
else {spielerpositiony -= 1; return true;}
case 'u':
if((labyrinth.length-1) == spielerpositiony) {return false;}
if(labyrinth[spielerpositiony+1][spielerpositionx] == false){return false;}
else {spielerpositiony += 1; return true;}
case 'l':
if(spielerpositionx == 0) {return false;}
if(labyrinth[spielerpositiony][spielerpositionx-1] == false){return false;}
else {spielerpositionx -= 1;return true;}
case 'r':
if((labyrinth[spielerpositiony].length-1) == spielerpositionx) {return false;}
if(labyrinth[spielerpositiony][spielerpositionx+1] == false){return false;}
else {spielerpositionx += 1; return true;}
}
return false;
}
@Override
public String toString() {
String result = "";
for(int i = 0; i < labyrinth.length; i++) {
for(int j = 0; j < labyrinth.length; j++) {
if(labyrinth[j] == true && i != spielerpositiony && j != spielerpositionx) {
result += "O";
}else if(labyrinth[j] == true && i == spielerpositiony && j == spielerpositionx){
result += "x";
}else if(labyrinth[j] == false) {
result += "#";
}
}
result += "\n";
}
return result;
}
}[/CODE]

Ich habe mal deinem Rat Folge geleistet. So sieht es nun aus
 
Du musst in der toString anstatt dem umbruch literal, den String printen und danach den temporären String wieder auf einen leeren String setzen 😉
 

Zurück
Oben