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
相关产品推荐
相关产品推荐

