使用%运算符时获取索引超出范围错误

时间:2014-12-03 02:56:47

标签: java

我遇到了一个分配方法的问题,所以基本上当我使用这个方法时

public class DFS {

private int[][] a;

public DFS(int[][] a){
    this.a=a;
}
/**
 * Recursively visits all vertices in matrix
 * @param x
 * @param y
 */
public void search(int x, int y){
    if(a[x][y] == -1){
        return;
    }
    else{
        a[x][y] = -1;
        System.out.println((char)(x+65)+", "+(char)(y+65));
        if(x<a.length-1){
            if(a[x+1][y] == 1){
                search(x+1, y);
            }
        }
        else{
            if(a[(x+1)%a.length][y] == 1){
                search((x+1)%a.length, y);
            }
        }
        if(y<a.length-1){
            if(a[x][y+1] == 1){
                search(x, y+1);
            }
        }
        else{
            if(a[x][(y+1)%a.length] == 1){
                search(x, (y+1)%a.length);
            }
        }
        if(x>0){
            if(a[x-1][y] == 1){
                search(x-1, y);
            }
        }
        else{
            if(a[(x-1)%a.length][y] == 1){
                search((x-1)%a.length, y);
            }
        }
        if(y>0){
            if(a[x][y-1] == 1){
                search(x, y-1);
            }
        }
        else{
            if(a[x][(y-1)%a.length] == 1){
                search(x, (y-1)%a.length);
            }
        }

    }
}

}

我一直收到ArrayIndexOutOfBounds错误,但如果我使用模数n作为数组的大小,这怎么可能呢?这是完整的类文件。

2 个答案:

答案 0 :(得分:1)

如果我按以下方式致电您的课程:

new DFS(new int[5][5], 5).search(0, 4);

我在这一行得到负x索引:

if (a[(x - 1) % a.length][y] == 1)

(0 - 1) % 5的结果是-1,因此是ArrayIndexOutOfBoundsException。在Java中,模运算结果的符号由被除数的符号决定。

答案 1 :(得分:0)

public class Demo {
    public static void main(String[] args) {
        int a[][]=new int[5][6];
        System.out.println(a.length);
    }
}

这里a.length会给你5。

但是在您的代码中,您将完全尝试derp

if(y<a.length-1){
    if(a[x][y+1] == 1){

请在此处将您的行号与您用作列号的y进行比较。

让我们尝试绘图

| _ | _ | _ |

| _ | _ | _ |

| _ | _ | _ |

| _ | _ | _ |

| _ | _ | _ |

| _ | _ | _ |

这里我们有6行和3列 所以,如果你尝试y&lt;(6-1),你的y是4 然后,如果您尝试访问第四列,您将获得ArrayOutOfBounds异常。

希望它足够清楚。