2011-09-18 297 views
0

当我在java中声明一个数组时,运行时出现此错误:线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常。尽管变量totalNumbers有一个值。当我将这个变量替换成一个像5这样的数字时,它正在工作。当声明数组时它必须是一个数字吗?在java中声明数组

int randomNumbers[]; 
randomNumbers = new int[totalNumbers]; 

增加了一些代码,但变量名称和注释在瑞典!但是,尽管如此,代码可能会被忽略!或者为什么不学一些瑞典语!= :)

// deklarera arrays för tal under 500 och för tal över 500 
int slumptalMindre[]; 
slumptalMindre = new int[antalSlumptalMindreÄn500]; 

int slumptalStörre[]; 
slumptalStörre = new int[antalSlumptal - antalSlumptalMindreÄn500]; 

//gå genom första array och omplacera tal till ny array 
for(int x = 0; x < antalSlumptal; x++) { 
    if(slumptal[x] < 500) { 

     slumptalMindre[x] = slumptal[x]; 
    } 

} 
+2

确定这是整个代码吗?尝试访问阵列范围之外的成员时,您会遇到索引越界异常... –

+1

请发布可编译代码和堆栈跟踪。 ArrayIndexOutOfBoundsException在数组访问上抛出,但是你没有发布代码数组,只有在初始化的地方 –

+0

不,这不是所有的代码。我只是问是否可以使用变量而不是数字? –

回答

0

你没有张贴什么值可能antalSlumptalMindreÄn500antalSlumptal,但根据您的代码,我认为都是积极和antalSlumptal>antalSlumptalMindreÄn500

I.e.让antalSlumptal = 20和antalSlumptalMindrenn = 5。

然后,数组slumptalMindre的长度是5,slumptalStörre的长度是15.但是没有声明数组slumptal

在您的for循环变量x范围从0到19,并且在每次迭代中您访问索引为x的数组slumptalMindre。显然,当x值变为5时,会导致ArrayIndexOutOfBoundsException。

我只能猜测你的意图是什么。看起来你想在数组slumptal上应用一些过滤器,并将所有小于500的值放入另一个数组中。

使用数组作为过滤器结果的一个问题是,在循环完成后,您不知道结果的长度。但是你必须事先初始化数组。

所以一个解决方案可能是使用两个循环。第一次遍历数组并计算有多少个数小于500.然后,用正确的大小初始化数组,然后第二个循环再次遍历数组,并将结果值复制到结果数组中。在第二循环中,你必须当心以访问阵列slumptal索引和索引之间进行区分来访问较短结果数组:

// count the numbers less than 500 
int count = 0; 
for(int x = 0; x < slumptal.length; x++) { 
    if(slumptal[x] < 500) 
    count++; 
} 
slumptalMindre = new int[count]; 

int y = 0; // Index to access array slumptalMindre 
for(int x = 0; x < slumptal.length; x++) { 
    if(slumptal[x] < 500) 
    slumptalMindre[y++] = slumptal[x]; 
}  

但上述方案不是最佳的,因为你必须通过阵列进行迭代两次。这只是因为结果应该是一个固定长度的数组。这是比较容易在这种情况下,使用像List动态大小的数据结构:关于编码风格

// Using a ArrayList of Integer values as the result 
List<Integer> slumptalMindre = new ArrayList<Integer>(); 

for(int x = 0; x < slumptal.length; x++) { 
    if(slumptal[x] < 500) 
    slumptalMindre.add(slumptal[x]); 
}  

还有一个提示:这是有效的,在Java变量和类名来使用日尔曼。但是这样做被认为是不好的风格,因为你很容易遇到问题。 Java编译器使用源文件的平台默认编码,除非您指定-encoding选项。在Windows上,默认编码是Cp1252,在Linux上通常是UTF-8。如果变音属于类名的一部分,情况会变得更糟,因为这会导致包含变音节点的类文件名。