【问题标题】:what is the error in my code ? trying to buid 2D matrix我的代码有什么错误?试图建立二维矩阵
【发布时间】:2015-02-22 03:05:17
【问题描述】:

我正在创建一个使用 java 创建二维矩阵的程序,它假设在检查数字是否为素数后构建一个二维数组。

我知道错误出现在 createMatrix 函数的 for 循环中,我希望有人能帮助我并解释我的错误在哪里以及如何修复它。

系统显示此错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
    at test6.test6.createMatrix(Question6.java:26)
    at test6.test6.main(Question6.java:52)

这是我的代码:

package test6;

public class test6 {

    public static int isPrimeNumber(int number) {
        if (number == 2 || number == 3) {
            return 1;
        }
        if (number % 2 == 0) {
            return 0;
        }
        int sqrt = (int) Math.sqrt(number) + 1;
        for (int i = 3; i < sqrt; i += 2) {
            if (number % i == 0) {
                return 0;
            }
        }
        return 1;
    }

    public static int[][] createMatrix(int[][] m) {
        int i, j;
        for (i = 0; i < m[0].length; i++) {

            for (j = 0; j < m.length; j++) {
                System.out.println(m[i][j]);
            }

        }
        return m;

    }

    public static String toString(int[][] m) {
        StringBuilder text = new StringBuilder();
        for (int row = 0; row < m.length; row++) {
            int r[] = m[row];
            for (int col = 0; col < r.length; col++) {
                if (col > 0)
                    text.append(", ");
                text.append(r[col]);
            }
            text.append("\n");
        }
        return text.toString();
    }

    public static void main(String[] args) {

        int[][] num = new int[][] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } };

        System.out.println(toString(createMatrix(num)));
    }

}

【问题讨论】:

  • 使用调试器准确查看数组索引超出范围的位置
  • 有了 Java 漂亮的堆栈跟踪,您不需要调试器。
  • 正如@aioobe 所说,这里的调试器太过分了。查看堆栈跟踪指向的行。有你的错误。如果您需要调试它,请在错误周围添加一些打印。

标签: java for-loop matrix runtime-error multidimensional-array


【解决方案1】:

您已经交换了相反的索引:

for (i = 0; i < m[0].length; i++) {    // i runs over the columns of first row
    for (j = 0; j < m.length; j++) {   // j runs over the rows
        System.out.println(m[i][j]);   // here i is the row, and j is the column!
    }
}

循环遍历矩阵的更好方法是:

for (i = 0; i < m.length; i++) {        // let i run over the rows
    for (j = 0; j < m[i].length; j++) { // let j run over the columns
        System.out.println(m[i][j]);
    }
}

【讨论】:

  • 这不是一个正确的方法,有时您需要先扫描长度,有时需要先扫描深度。一个并不比另一个好(除非算法需要特定的方向)
  • 重新制定了答案。
  • 我仍然认为,如果您要大胆声明它更好,您应该指定哪种方式更好。否则,这一切都是“相信它”,而没有说明为什么它是一种改进。
  • 这样更好,因为它避免了 ArrayIndexOutOfBoundsExceptions。不是一个非常大胆的声明。
  • 这不是更好的方式,而是正确的方式。语义:p
【解决方案2】:

您正在将您的 m X n 数组沿 m 方向向下移动 n 次,并在 n 方向向下移动 m 次。

因此,在createMatrix(...) 内,您很有可能会走出阵列(除非它是方形阵列)。此外,createMatrix 是一个可怕的名称,因为它只是打印出在其他地方创建的矩阵。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多