IndexOutofBounds 异常创建迷宫

IndexOutofBounds exception creating a maze

我正在做一项学校作业,我应该根据文本文件创建一个迷宫。我的问题是创建迷宫。我知道这可能是一个简单的修复,但我真的被困住了,需要完成它。有什么建议吗?

package application;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javafx.application.Application;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;

public class Main extends Application {
LabyrintRute[][] Labyrint;
int X;
int Y;
int startx;
int starty;
Spiller spilleren;
int sizeX;
int sizeY;

@Override
public void start(Stage primaryStage) {
    try {
        GridPane root = new GridPane();
        Spiller spilleren = new Spiller(startx, starty);
        filLeser();

        root.add(spilleren.getUtseende(), spilleren.getxPossisjon(), spilleren.getyPossisjon());

        for(int x = 0; x<X; x++){
            for(int y = 0; y<Y; y++){
        root.add(Labyrint[x][y].getUtseende(), x, y);
        }
        }

        Scene scene = new Scene(root, X*10, Y*10);
        scene.setOnKeyPressed(new FilLytter(this));
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

public void filLeser() {
    String teksten = "";
    File fila;

    int rad = 0;

    FileChooser filvelger = new FileChooser();
    filvelger.setTitle("Åpne en tekstfil");
    filvelger.getExtensionFilters().add(new ExtensionFilter("Text Files", "*.txt"));
    fila = filvelger.showOpenDialog(null);


    try (Scanner filleser = new Scanner(fila)) {
        X = filleser.nextInt();
        Y = filleser.nextInt();
        teksten = filleser.nextLine();

        Labyrint = new LabyrintRute [X][Y];
        while (filleser.hasNext()) {
            teksten = filleser.nextLine();
            for (int i = 0;i< X;i++) {
                char tegn = teksten.charAt(i);
                switch (tegn) {
                case '#':
                    Labyrint[i][rad] = new Vegg(i, rad);
                    break;
                case ' ':
                    Labyrint[i][rad] = new Gang(i, rad);
                    break;
                case '-':
                    Labyrint[i][rad] = new Utgang(i, rad);
                    break;
                case '*':
                    Labyrint[i][rad] = new Gang(i, rad);
                    startx = i;
                    starty = rad;
                    break;
                }
                    rad++;

                }
            }
        } catch (FileNotFoundException e) {
            System.out.println("Kan ikke åpne fila!");
            e.printStackTrace();
        }
    }

public void flyttSpiller(int deltax, int deltay) {
    int nyx = spilleren.getxPossisjon() + deltax;
    int nyy = spilleren.getyPossisjon() + deltay;
    Labyrint[nyx][nyy].flyttHit(spilleren);

}

public static void main(String[] args) {
    launch(args);
}
}

"Vegg"(墙)class:

package application;

import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;

public class Vegg extends LabyrintRute {
private Node utseende;

public Vegg(int xKoordinat, int yKoordinat) {
    super(xKoordinat, yKoordinat);
    utseende = new Rectangle(10, 10, Color.MEDIUMPURPLE);
}

@Override
public void flyttHit(Spiller spilleren) {
    //spilleren.setxPossisjon(getxKoordinat());
    //spilleren.setyPossisjon(getyKoordinat());
}

@Override
public Node getUtseende() {
    return utseende;
}

}

摘要class:

package application;

import javafx.scene.Node;

public abstract class LabyrintRute {
private int xKoordinat;
private int yKoordinat;

public LabyrintRute(int xKoordinat, int yKoordinat) {
    this.xKoordinat = xKoordinat;
    this.yKoordinat = yKoordinat;
}

public int getxKoordinat() {
    return xKoordinat;
}

public int getyKoordinat() {
    return yKoordinat;
}

public abstract void flyttHit(Spiller spilleren);

public abstract Node getUtseende();

}

我还有一个"Gang"(段落)和一个"Utgang"(退出)class。它们类似于 "Vegg" class.

非常感谢您的投入!对不起挪威代码..

当您读取文件并创建实验室时,您的变量 rad 在从 0X-1 的循环中递增。但是,您使用它来索引 Y 维度。如果 X > Y,你将 运行 出界。

由于您的代码没有完全揭示文件的规则以及实验室的形成方式,我无法直接提供修复。

我认为您很可能需要某种嵌套循环。也许你应该用 nextLine 保留并增加 i 并以某种方式使内部循环像 for (int rad = 0; rad < Y; rad++) 但同样,如果没有进一步的内部,我不可能说。