提问人:Ignacio Romero 提问时间:8/25/2022 最后编辑:user207421Ignacio Romero 更新时间:8/25/2022 访问量:62
是否可以在 Java 中获取 ArrayIndexOutOfBoundsException 的值?
Is it possible to get the value of an ArrayIndexOutOfBoundsException in Java?
问:
我正在尝试做一个程序,它使用一个矩阵并创建一个新矩阵,每个元素都是原始元素的每个相邻元素加上它本身的总和。
很容易理解,矩阵的“边缘”值,如果你通过矩阵索引访问它们,那么你可能会得到类似 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:对不起,西班牙语编程,这是大学作业。
答:
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
评论
get(matrix, row, col)