搜索
数据结构和算法 - 为何我这里的IndexOutOfBoundsException无法跳过(Java)?
伊谢尔伦
伊谢尔伦 2017-04-17 14:28:03
[Java讨论组]
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(2)
迷茫

问题出在构造函数上,你传入了 int N 的参数, 但是没有把这个N赋给 Percolation 的变量N,所以在后续判断的时候if (i < 1 || i > N || j < 1 || j > N) 这里面N始终为0。所以总是认为数组越界。

将构造函数改成以下就可以了,只是增加了this.N = N的赋值语句。

public Percolation(int N) {

    if (N <= 0) {
        throw new IllegalArgumentException("N不可以小于等于0");
    }

    grid = new int[N][N];

    for (int row = 0;row < N;row++) {
        for (int col = 0;col < N;col++){
            grid[row][col] = 0;
        }
    }

    wuf = new WeightedQuickUnionUF(N*N);
    this.N = N;
}

然后第二个问题,我大概看了一眼。你把if语句删掉之后,下面的代码就陷入死循环了

do {
    rdRow = StdRandom.uniform(1, N+1);
    rdCol = StdRandom.uniform(1, N+1);
}
while (pc.isOpen(rdRow, rdCol) == false);

isOpen函数一直返回是true,即grid所有的元素全都是0。这也不难理解,在这一步操作之前,你只是初始化了grid矩阵,但是没有做任何赋值运算。但是你在不断的返回一个随机的rdRow和rdCol去访问这个grid的元素,所以isOpen函数始终是返回true。

so……好好debug一下你的代码……多把几步的返回结果打印出来,你就知道为啥了。

高洛峰

Percolation 类的N赋值了吗?似乎没有,因此你的 N被默认赋值为0
`public void open(int i, int j) {

if (i < 1 || i > N || j < 1 || j > N) {
    //i>N 一直成立 所以这个异常总是抛出
    throw new IndexOutOfBoundsException("Row or Col index out of bounds!");
}`

你可以在

public Percolation(int N){
    //在这里加个句
    this.N = N;
......
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板