gpt4 book ai didi

java - IndexOutOfBounds 异常处理

转载 作者:行者123 更新时间:2023-11-29 05:09:14 26 4
gpt4 key购买 nike

我正在做一项作业,需要计算位置 (x,y) 周围像素的 NxN 平均值。

当我传入一个大小变量时,我试图创建一个通用函数来执行此操作。

我只允许大小或 NxN 矩阵为 3x3、5x5 或 7x7。

我想做的是为每个像素做一些通用循环,它检查它是否是一个角落案例,然后是一个侧面案例,如果不是任何一个,它是一个默认案例。

例子

0  1  2  3  4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24

如果我想做一个 5x5 的平均值,它需要这 25 个像素值来计算。但是如果我的 (x,y) 位置在 (1,2),它就会出界。

我试图找出每种情况的情况,但我发现解决起来很复杂,因为 5x5 出现了一些情况,而 3x3 不存在。如果我的 (x,y) 在 (1,1) 处,它不属于我的极端情况,但它确实属于我的两个侧面情况(顶部和左侧)。

我想知道将所有内容都放入 try catch 语句中是否安全/值得,以及数组位置是否越界,这没什么大不了的。

我根本不需要做任何情况,如果它们超出范围,我可以只检查 9 (3x3)、25 (5x5) 或 49 (7x7) 个单独的数组位置。

例如 3x3

try{
imageBuffer.getRBG(x - 1, y -1);
}catch{...}
try{
imageBuffer.getRBG(x, y -1);
}catch{...}
try{
imageBuffer.getRBG(x + 1, y -1);
}catch{...}

这看起来真的很糟糕,但我在试图为任何平均值的一个通用函数找出这些情况时失去了理智。

如果像素 (x,y) 周围的 NxN 平均值超出范围,它将计算范围内像素的平均值。如果它是 3x3 平均值并且它是第一个角落案例(左上角 (0,0)),我将计算我可以访问的 4 个像素。所以

0 1 2
3 4 5
6 7 8

我会计算 4、5、7 和 8 的平均值

最佳答案

不,如果没有必要,不要引发异常。这是编码风格的问题。在这种情况下,解决方案实际上非常简单:

public int avg(int[][] matrix , int n , int x , int y){
int sum = 0;

//the number of pixels to go left and right from the center of
//the nxn-matrix
int nHelper = n / 2;

//ensure the left upper corner of your matrix is in bounds
int x_start = (x - nHelper < 0 ? 0 : x - nHelper);
int y_start = (y - nHelper < 0 ? 0 : y - nHelper);

//create sum of all elements in the nxn-matrix and in bounds of
//the big matrix (assumption: the matrix is an array of columns
int i , j;
for(i = x_start ; i < x + nHelper + 1 && i < matrix.length ; i++)
for(j = y_start ; j < y + nHelper + 1 && j < matrix[i].length ; j++)
sum += matrix[i][j];

//calculate the average
return sum / ((i - x_start) * (j - y_start));
}

这会计算以 x,y 为中心的 nxn 矩阵的平均值。将其转换为与图像一起使用应该不会太困难。虽然不同的方法可能更有效,但如果您想计算矩阵中所有 单元格的平均值。但它展示了基本思想。

关于java - IndexOutOfBounds 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29269586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com