我的阵列在哪里?

时间:2017-10-17 10:49:13

标签: java arrays

我已经查看了有关越界错误的其他问题并了解它们,无法理解此代码中的错误。

问题:一个JAVA程序,它将读取对应于关系R的布尔矩阵,并输出R是自反,对称,反对称和/或传递。程序的输入将是n×n布尔矩阵的大小n,后跟矩阵元素。

在输入关系无法具有特定属性的情况下,程序必须输出原因。

解决方案:我提供了代码,它会抛出" java.lang.ArrayIndexOutOfBoundsException"主要和第65行的错误。我无法看到我的数组是如何超出范围的

  

错误:线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException:1在XYZ.BooleanMatrix.main(BooleanMatrix.java:65)

代码:

package XYZ;
import edu.princeton.cs.algs4.*;
public class BooleanMatrix {

// read matrix from standard input
public static boolean[][] read() {
    int n = StdIn.readInt();
    boolean[][] a = new boolean[n][n];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (StdIn.readInt() != 0)
                a[i][j] = true;
        }
    }
    return a;
}

// print matrix to standard output
public static void print(boolean[][] a) {
    int n = a.length;
    StdOut.println(n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (a[i][j])
                StdOut.print("1 ");
            else
                StdOut.print("0 ");
        }
        StdOut.println();
    }
}

// random n-by-n matrix, where each entry is true with probability p
public static boolean[][] random(int n, double p) {
    boolean[][] a = new boolean[n][n];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            a[i][j] = StdRandom.bernoulli(p);
        }
    }
    return a;
}

// display the matrix using standard draw
// depending on variable which, plot true or false entries in foreground
// color
public static void show(boolean[][] a, boolean which) {
    int n = a.length;
    StdDraw.setXscale(0, n - 1);
    StdDraw.setYscale(0, n - 1);
    double r = 0.5;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (a[i][j] == which) {
                StdDraw.filledSquare(j, n - i - 1, r);
            }
        }
    }
}

// test client
public static void main(String[] args) {
    int n = Integer.parseInt(args[0]); //LINE 65
    double p = Double.parseDouble(args[1]);
    boolean[][] a = random(n, p);
    print(a);
    show(a, true);
}}

1 个答案:

答案 0 :(得分:0)

我不知道StdDraw.setXscale(0, n - 1);的确切工作方式,但我认为它会创建一个包含n-1行的表格。所以如果你试着用n行填充它会有一个越界错误。尝试在第47行使用它:

StdDraw.setXscale(0, n);
StdDraw.setYscale(0, n);

如下面评论中所述,你的帖子:如果你在调用程序时没有输入任何参数,你会得到一个超出范围的例外,因为程序需要aray中的参数而没有任何参数。

提供参数open命令行和调用/ java yourcompiledjavafile arg [0] arg [1]