是否可以在 Java 中获取 ArrayIndexOutOfBoundsException 的值?

Is it possible to get the value of an ArrayIndexOutOfBoundsException in Java?

提问人:Ignacio Romero 提问时间:8/25/2022 最后编辑:user207421Ignacio Romero 更新时间:8/25/2022 访问量:62

问:

我正在尝试做一个程序,它使用一个矩阵并创建一个新矩阵,每个元素都是原始元素的每个相邻元素加上它本身的总和。

很容易理解,矩阵的“边缘”值,如果你通过矩阵索引访问它们,那么你可能会得到类似 matrix[-1][0] 的东西。问题是,Java 抛出异常,因此程序崩溃。

有没有可能抓住它并获得它所具有的价值?即使它没有初始化,因为问题是,从数学上讲,当它访问越界地址时,你可以将整个项乘以 0。

public class OpMatriz {

    public static void main(String[] args) {
        
        int[][] miMatriz= {{1,9,10,7,2,1,9},{-5,1,9,10,7,2,1},{2,1,3,1,5,2,11}};
        imprimeMatriz(miMatriz);
        
        miMatriz = OpMatriz.sumaAdyacentes(miMatriz);
        
        imprimeMatriz(miMatriz);
        

    }
    
    public static int[][] sumaAdyacentes(int[][] matriz){
        
        int n = matriz.length;
        int m = matriz[0].length;
        
        int[][] matrizAux = new int[n+2][m+2];
        int[][] matrizRes = new int[n][m];
        
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                matrizAux[i+1][j+1] = matriz[i][j];
            }
        }
        
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                matrizRes[i-1][j-1] = matrizAux[i-1][j] + matrizAux[i][j+1] + matrizAux[i+1][j] + matrizAux[i][j-1] + matrizAux[i][j];
            }
        }
        
        return matrizRes;
    }
    
    public static void imprimeMatriz(int[][] matriz) {
        for (int i = 0; i < matriz.length; i++) {
            System.out.print("| ");
            for (int j = 0; j < matriz[0].length; j++) {
                System.out.printf("%2d ", matriz[i][j]);
            }
            System.out.println("|");
        }
        System.out.println();
    }
    

}

我当前的程序只是使一个“中间”矩阵比原始矩阵大一点,全部初始化为 0,因此它可以为边缘情况添加它。现在,我不想使用任何条件,因为这是改进算法的练习的想法。

matrizRes[i][j] = i * matriz[i-1][j] + (m+1-j) * matriz[i][j+1] + (n+1-i) * matriz[i+1][j] + j *matriz[i][j-1] + matriz[i][j];

我的想法是使用这样的方程式,所以当一个术语试图使用无效的索引时,无论它有什么值,它都会乘以 0。所以这样做,我不能使用这个“中间”矩阵,只用原始矩阵来解决它。

那么,最后,有没有办法获得一个即使没有初始化的值?ArrayIndexOutOfBoundsException

PD:对不起,西班牙语编程,这是大学作业。

Java 数组 异常 ArrayIndexOutofBoundsException

评论

4赞 Sweeper 8/25/2022
“因为问题是,从数学上讲,当它访问一个越界地址时,你可以将整个项乘以 0”我没有看到任何关于访问无效索引的“数学”?你在说什么“0”?无效索引不包含 0 - 未定义。您应该以一种永远不会访问无效索引的方式编写算法。
1赞 Sweeper 8/25/2022
你为什么不想使用任何条件?没有条件条件到底是如何“改进算法”的?
1赞 shmosel 8/25/2022
当一个术语试图使用无效的索引时,无论它有什么值......无效索引没有任何值,因为它们不存在。不能将它们的值相乘,就像不能将未声明的变量相乘一样。
3赞 access violation 8/25/2022
编写一个访问器方法,用于检查 row 和 col 值,并返回 0 表示越界引用。但为什么呢?get(matrix, row, col)
1赞 tgdavies 8/25/2022
你没有解释你所说的“改进算法”是什么意思,但请注意,相对于检查几个索引值,抛出异常的代价非常大。

答:

1赞 anantha ramu 8/25/2022 #1

看起来您想知道边界或有关异常的更多信息。

但是,我们不能捕获异常并围绕它执行逻辑。不建议这样做。

但是,如果您仍然想知道有关异常的信息。异常消息具有很强的描述性。你可以使用 e.getMessage() 下面是 e.getMessage() 的示例。

Index 3 out of bounds for length 3

为了找到边界,我们可以解析错误消息。下面是一个示例。

    int[][] matrix = new int[3][];
    try {
      int assign[] = matrix[3];
    } catch (IndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
      Stream<MatchResult> matchResultStream = Pattern.compile("\\d+").matcher(e.getMessage()).results();
      List<String> matchResults = matchResultStream.map(x -> x.group()).collect(Collectors.toList());
      if (matchResults.size() > 1) {
        System.out.println("Error Index " + matchResults.get(0));
        System.out.println("Max Index Bounds " + matchResults.get(1));
      }
    }

Output:

    Index 3 out of bounds for length 3
    Error Index 3
    Max Index Bounds 3