【问题标题】:Fix Index out of bounds for array?修复数组的索引超出范围?
【发布时间】:2021-05-09 15:28:51
【问题描述】:

我正在使用 Eclipse 控制台创建迷宫游戏。我正在尝试移动一名球员,并将球员保存在新位置,以便我可以将他移动到另一个方向。但是,每次我尝试移动播放器时,我都会得到索引 ___ 超出长度 5 的范围(通常为 -1 或 5)。它正在跳过整个数组,我不确定如何修复它。

运行时会打印以下内容

P. . ! .

。 . . . .

。 . . ! .

! ! . .

! . ! ! .

请选择以下选项之一:

按 1 向上移动。

按 2 向下移动。

按 3 向左移动。

按 4 向右移动。

按 0 停止游戏。

我只列出了一个动作,但其余的都是一样的,有互换的变量。每个选项都返回索引超出范围。有人建议我创建一个“检查”系统,但这并不能解决问题。它只是运行程序而不允许任何动作,因为每个动作都会返回出界。我相信这与这条线有关

mazeStructure[vxTemp][vyTemp] = mazeStructure[i][k-1];

无论是那个还是与 for 条件有关的东西。如果有人可以提供修复,将不胜感激。

Scanner input = new Scanner(System.in);
int rowsTotal = 5;
int columnsTotal = 5;
int vxTemp = 0;
int vyTemp = 0;
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(" ");
    }
        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();
    int a = 0;

   
    if (choice == 1 && a >= 0 && a < columnsTotal){
    for (int i = 0; i < rowsTotal; i++){
        for (int k = 0; k < columnsTotal; k++){
        if (mazeStructure[vxTemp][vyTemp-1].equals("!") == false && mazeStructure[i][k].equals(mazeStructure[vxTemp][vyTemp])){
                    mazeStructure[vxTemp][vyTemp] = ".";
                    mazeStructure[vxTemp][vyTemp-1] = "P";
                    mazeStructure[vxTemp][vyTemp] = mazeStructure[i][k-1];
       }else if (mazeStructure[vxTemp][vyTemp-1] == "!"){
                    System.out.println("Move isn't allowed.");
       }else {
        continue;}

【问题讨论】:

  • 分享你的错误画面
  • @Uzair 线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException:索引 5 在trest.main(trest.java:89) 的长度为 5 超出范围这发生在“down”函数上,这是 vyTemp+1 而不是 vyTemp-1。

标签: java arrays 2d maze


【解决方案1】:

if (mazeStructure[vxTemp][vyTemp-1].equals("!") == false &amp;&amp; mazeStructure[i][k].equals(mazeStructure[vxTemp][vyTemp])){ 行中,您尝试通过[vxTemp][vyTemp-1] 访问mazeStructure。您将 vyTemp 初始化为 0,并且在此之前它不会改变。您通过尝试vyTemp - 1 开始该循环,这将是-1。这将超出您的数组的范围。

您对循环中的变量 k 执行相同操作。 k 附近的第一次将为零。因此,尽管k - 1 存在是可以的,但您不能尝试访问某个 -1 索引处的任何数组。

【讨论】:

  • 这是有道理的,但是对于“向下”选项,我有 vyTemp+1,并且索引 5 超出了长度 5 的范围。这对于每个选择(向上、向下、左,右)。
  • 数组索引为零。这意味着您使用数组 [0] 访问数组的第一个元素。如果我们从 0 开始并且长度为 5,那么我们的结尾 index 是 4。换句话说,虽然数组 length 是 5,但我们在 array[4] 处访问该元素(因为我们从 0 开始)。这就是 5 越界的原因。
【解决方案2】:

我猜问题出在这一行的vyTemp-1

if (mazeStructure[vxTemp][vyTemp-1].equals("!") == false &amp;&amp; mazeStructure[i][k].equals(mazeStructure[vxTemp][vyTemp])){

vyTemp初始值为0

【讨论】:

  • 有道理,但这对所有事情都是一样的。例如,我的“向下”选项,即 vyTemp+1,返回的索引 5 超出了长度 5 的范围。
【解决方案3】:
Scanner input = new Scanner(System.in);
int rowsTotal = 5;
int columnsTotal = 5;
int vxTemp = 0;
int vyTemp = 0;
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(" ");
    }
        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();
    int a = 0;

   
    if (choice == 1 && a >= 0 && a < columnsTotal){
    for (int i = 0; i < rowsTotal; i++){
        for (int k = 0; k < columnsTotal; k++){

//if条件有错误。如果您的选择是 1。它将运行此 如果条件'mazeStructure[vxTemp][vyTemp-1].equals("!")'。作为 vyTemp = 0. vyTemp -1

 if (mazeStructure[vxTemp][vyTemp-1].equals("!") == false && mazeStructure[i][k].equals(mazeStructure[vxTemp][vyTemp])){
                    mazeStructure[vxTemp][vyTemp] = ".";
                    mazeStructure[vxTemp][vyTemp-1] = "P";
                    mazeStructure[vxTemp][vyTemp] = mazeStructure[i][k-1];
       }else if (mazeStructure[vxTemp][vyTemp-1] == "!"){
                    System.out.println("Move isn't allowed.");
       }else {
        continue;}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2021-01-27
    • 2016-06-11
    相关资源
    最近更新 更多