繁体   English   中英

索引 (-1, 5) 超出长度 5 的范围?

[英]Index (-1, 5) out of bounds for length 5?

我是 Java 编码的新手,所以请善待。 我正在尝试使用控制台中的 2D 数组创建迷宫游戏。 一切都很好,直到我 go 采取行动。 我已经设置好了,所以你 select 一个数字以便朝那个方向移动。 每次我尝试移动时,我都会收到错误“索引(-1 或 5,取决于移动)超出长度 5 的范围”。 如果有人可以查看我的代码并给我一些反馈,我们将不胜感激。

public class trest {

    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(System.in);
        //scans user input
        int rowsTotal = 5;
        int columnsTotal = 5;
        int vxTemp = 0;
        int vyTemp = 0;
        
        //creates variables (vx= variable x) (TEMP = TEMP PLAYER POS.)
        //Create short display showing "logo": who made it and what its purpose is for.
        //maybe simple sys out "Welcome to maze game for mentally challenged, by Jack Paster and co."
        String[][] mazeStructure = {
                {"P", ".", "!", "!", "."},
                {".", ".!", ".", ".", "."},
                {"", ".", ".", "!", "."},
                {"!", "!", ".", "T", "."},
                {"!", ".", "!", "!", "."},
        };
        boolean won = false;
        while (won == false) {
            for (int a = 0; a < rowsTotal; a++) {
                for (int b = 0; b < columnsTotal; b++) {
                    System.out.print(mazeStructure[a][b]);
                    System.out.print(" ");
                }//prints the maze
                System.out.print("\n");
            }
            System.out.printf("\n");
            System.out.println("Please select one of the following:");
            System.out.println("Press 1 to move up.");
            System.out.println("Press 2 to move down.");
            System.out.println("Press 3 to move left.");
            System.out.println("Press 4 to move right.");
            System.out.println("Press 0 to stop playing the game.");
            int choice = input.nextInt();
            //Gives options for movement
            //scans for input input
            int a = 0;
            if (choice == 1 && a >= 0 && a < columnsTotal) {
                //if choice is 1, do this
                for (int x = 0; x < rowsTotal; x++) {
                    for (int y = 0; y < columnsTotal; y++) {
                        if (mazeStructure[vxTemp][vyTemp - 1].equals("!") == false && mazeStructure[x][y].equals(mazeStructure[vxTemp][vyTemp])) {
                            //if mazeStructure is valid (doesnt = !, in parameters)
                            mazeStructure[vxTemp][vyTemp] = ".";
                            mazeStructure[x][y - 1] = "P";
                            mazeStructure[vxTemp][vyTemp] = mazeStructure[x][y - 1];
                            //change old temp to ., move down. temp is now y-1. TEMP = PLAYER Pos.
                        } else if (mazeStructure[vxTemp][vyTemp - 1] == "!") {
                            //if player tries to move into !, dont allow.
                            System.out.println("Move isn't allowed.");
                        } else {
                            continue;
                        }//continue
                    }
                }
            } else if (choice == 2 && a >= 0 && a < columnsTotal) {
                //if choice is 2, do this
                for (int x = 0; x < rowsTotal; x++) {
                    for (int y = 0; y < columnsTotal; y++) {
                        if (mazeStructure[vxTemp][vyTemp + 1].equals("!") == false && mazeStructure[x][y].equals(mazeStructure[vxTemp][vyTemp])) {
                            //if mazeStructure is valid (doesnt = !, in parameters)
                            mazeStructure[vxTemp][vyTemp] = ".";
                            mazeStructure[x][y + 1] = "P";
                            mazeStructure[vxTemp][vyTemp] = mazeStructure[x][y + 1];
                            //change old temp to ., move up. temp is now y+1. TEMP = PLAYER Pos.
                        } else if (mazeStructure[vxTemp][vyTemp + 1] == "!") {
                            //if player tries to move into !, dont allow.
                            System.out.println("Move isn't allowed.");
                        } else {
                            continue;
                        }//continue
                    }
                }
            } else if (choice == 3 && a >= 0 && a < columnsTotal) {
                //if choice is 3, do this
                for (int x = 0; x < rowsTotal; x++) {
                    for (int y = 0; y < columnsTotal; y++) {
                        if (mazeStructure[vxTemp - 1][vyTemp].equals("!") == false && mazeStructure[x][y].equals(mazeStructure[vxTemp][vyTemp])) {
                            //if mazeStructure is valid (doesnt = !, in parameters)
                            mazeStructure[vxTemp][vyTemp] = ".";
                            mazeStructure[x - 1][y] = "P";
                            mazeStructure[vxTemp][vyTemp] = mazeStructure[x - 1][y];
                            //change old temp to ., move left. temp is now x-1. TEMP = PLAYER Pos.
                        } else if (mazeStructure[vxTemp - 1][vyTemp] == "!") {
                            System.out.println("Move isn't allowed.");
                            //if player tries to move into !, dont allow.
                        } else {
                            continue;
                        }//continue
                    }
                }
            } else if (choice == 4 && a >= 0 && a < columnsTotal) {
                for (int x = 0; x < rowsTotal; x++) {
                    for (int y = 0; y < columnsTotal; y++) {
                        if (mazeStructure[x][y].equals(mazeStructure[vxTemp][vyTemp]) && mazeStructure[vxTemp + 1][vyTemp].equals("!") == false) {
                            //if mazeStructure is valid (doesnt = !, in parameters)
                            mazeStructure[vxTemp][vyTemp] = ".";
                            mazeStructure[x + 1][y] = "P";
                            mazeStructure[vxTemp][vyTemp] = mazeStructure[x + 1][y];
                            //change old temp to ., move left. temp is now x+1. TEMP = PLAYER Pos.
                        } else if (mazeStructure[vxTemp + 1][vyTemp] == "!") {
                            System.out.println("Move isn't allowed.");
                        } else {
                            continue;
                        }//continues
                    }
                }
            } else if (choice == 0) {
                System.exit(0);
                //if choice is 0, quit the game.
            }
        }
        System.out.println("You Won! Congratulations!");
        input.close();
        //quit game.
    }
}

每次在您的代码中,当您在循环中使用x-1x+1y-1等时,您都会尝试在数组之外获取索引。 你必须保护你的代码免受它的影响。

该程序包含一个 5x5 矩阵,您正在使用循环遍历它。 很明显,您将超出范围,因为您使用的是 +1 的相对索引。 例如。

for (int x = 0; x < rowsTotal; x++){
    for (int y = 0; y < columnsTotal; y++){
        if (mazeStructure[vxTemp][vyTemp+1].equals("!") == false && mazeStructure[x][y].equals(mazeStructure[vxTemp][vyTemp])){
                    //if mazeStructure is valid (doesnt = !, in parameters)
                    mazeStructure[vxTemp][vyTemp] = ".";
                    mazeStructure[x][y+1] = "P"; **<<--- Look here**
                    mazeStructure[vxTemp][vyTemp] = mazeStructure[x][y+1];
                  //change old temp to ., move up. temp is now y+1. TEMP = PLAYER Pos.
        }else if (mazeStructure[vxTemp][vyTemp+1] == "!"){
                        //if player tries to move into !, dont allow.
                    System.out.println("Move isn't allowed.");
        }else {
        continue;}//continue

           }
         }

代码mazeStructure[x][y+1] = "P"; 当 y 为 4 时,将遇到一个超出范围的异常,因为您的循环预计会循环到columnsTotal为 5。

在这段代码中有多行你正在使用 x 和 y 执行此操作。 请调试以查看案例。

抛出异常是因为您尝试访问不存在的数组元素。

如果您尝试向上移动,则会发生这种情况,因为您将vyTemp初始化为 0 并尝试访问mazeStructure[vxTemp][vyTemp - 1] ,这是 java 不支持的 -1。 当您尝试向左移动时,会发生类似的事情,但使用vxTemp而不是vyTemp

为此,我建议您添加一个检查是否超出范围:

if (vyTemp - 1 >= 0)
{
    // do it
}

如果您尝试向下移动,它会出现在第 89 行mazeStructure[x][y + 1] = "P"; 因为您遍历整个 2D 数组,这意味着 y 在某些时候为 4,因此 y + 1 超出范围。 当您尝试向右移动时,会发生同样的情况,但使用x而不是y

我不太确定您为什么要遍历整个数组,但我想越界检查也可以解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM