我想返回一个索引的数组,其中getElem()等于或大于某个值。
这是我的功能:
public static int []findIndex(BufferedImage image,int value)
{
DataBuffer b = image.getRaster().getDataBuffer();
int array[] = new int[600];
for(int i=0;i<76400;i++)
{
if(b.getElem(i)>=value)
array[i]=i;
}
return array;
}
但我有错误
"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 27001
at arraytest.imageMan.findIndex(imageMan.java:139)
at arraytest.imageMan.main(imageMan.java:183)"
答案 0 :(得分:2)
int array[] = new int[600];
您声明的数组大小为600
。
for(int i=0;i<76400;i++)
然而,您尝试在76400
'索引处引用该数组。
为什么这不起作用?
好吧,当你说new int[600]
时,你实际上在说,我的数组可以存储600个东西,这意味着它有600个不同的“插槽”来存储值。
您可以从0
开始按索引访问这些值。
array[0] // First item
array[599] // Last item.
您的错误已经发生,因为您已超过599
。
如何解决此问题
好吧,你可以让你的数组76400
长,(这对我来说是可疑的),或者你可以将76400
改为array.length
(或600
)in你的for
循环。
答案 1 :(得分:2)
这是我找到的解决方案..
我认为这是最好的..
public static int[] findIndex(BufferedImage image, int value) {
DataBuffer b = image.getRaster().getDataBuffer();
int array[] = new int[600];
int j = 0;
for (int i = 0; i < b.getSize(); i++) {
if (b.getElem(i) >= value) {
if (j < 600) {
array[j] = i;
j++;
}
}
}
return array;
}
答案 2 :(得分:0)
那是因为你的循环从0到76400,远远大于数组的大小。
public static int []findIndex(BufferedImage image,int value)
{
DataBuffer b = image.getRaster().getDataBuffer();
int array[] = new int[600];
for(int i=0;i<array.length;i++)
{
if(b.getElem(i)>=value)
array[i]=i;
}
return array;
}
答案 3 :(得分:0)
这是我的最后一项功能。 我们应该如何选择通用编程,我做了一些改变,使得精确关注这一点。 现在使用列表而不是静态数组。
public static int[] findIndex(BufferedImage image, int value) {
DataBuffer b = image.getRaster().getDataBuffer();
ArrayList<Integer> a = new ArrayList<>(20);
int j = 0;
for (int i = 0; i < b.getSize(); i++) {
if (b.getElem(i) >= value) {
a.add(i);
j++;
}
}
int array[] = new int[a.size()];
for (int k = 0; k < a.size(); k++) {
array[k] = a.get(k);
}
return array;
}