You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中能否获取ArrayIndexOutOfBoundsException对应的越界访问值?

矩阵邻接元素求和的问题解答

关于捕获ArrayIndexOutOfBoundsException获取越界值的结论

不行。Java中ArrayIndexOutOfBoundsException是在索引越界的访问操作执行前就会抛出的,此时你根本没有访问到任何“对应的值”——不管这个值是否初始化,JVM都不会允许你完成越界访问的操作,自然也无法从异常中获取所谓的“越界访问值”。

你的公式思路的问题

你想通过i * matriz[i-1][j]这类表达式,让越界时的系数为0来抵消,但这个逻辑根本无法执行:只要i-1是无效索引,JVM会直接抛出异常终止代码,根本走不到乘法运算的步骤。所以这个思路在Java中是不可行的,因为越界访问的操作本身就不被允许执行。

无判断条件的可行方案

你当前使用的“创建边缘为0的中间矩阵”的方法,已经完全符合“无任何条件判断”的要求:

  • 中间矩阵matrizAux的边缘元素默认初始化为0,不需要额外赋值
  • 遍历计算时直接访问matrizAux的上下左右元素,不需要判断索引是否越界,因为所有访问的索引都是有效的

如果想尝试不用额外矩阵的写法,只能通过在访问前确保索引有效的逻辑来规避越界,比如用三元运算符(但本质仍是条件判断,如果作业严格禁止任何形式的条件判断,原中间矩阵方案仍是最优解):

public static int[][] sumaAdyacentes(int[][] matriz) {
    int n = matriz.length;
    int m = matriz[0].length;
    int[][] matrizRes = new int[n][m];

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int top = (i > 0) ? matriz[i-1][j] : 0;
            int right = (j < m-1) ? matriz[i][j+1] : 0;
            int bottom = (i < n-1) ? matriz[i+1][j] : 0;
            int left = (j > 0) ? matriz[i][j-1] : 0;
            matrizRes[i][j] = top + right + bottom + left + matriz[i][j];
        }
    }
    return matrizRes;
}

附原程序代码

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();
    }
    

}

注:变量使用西班牙语是因为这是大学作业要求。

内容的提问来源于stack exchange,提问作者Ignacio Romero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:36:32