关于java:Array Index Out of Bounds异常

Array Index Out Of Bounds Exception

本问题已经有最佳答案,请猛点这里访问。

一直在四处看看是否有什么可以帮助我的,但我对人们正在回答的内容不甚了解,而我所了解的一切似乎都无法解决问题! 因此,基本上如标题所述,我得到了超出范围异常的数组索引,我也不知道为什么。 任何帮助是极大的赞赏。

码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import javax.swing.*;

public class Array {
    public static void main(String[] args) {
        double height[] = new double[10];
        String heightAsString;
        int i, over18 = 0, under16 = 0;

        for(i = 1; i <= height.length; i++){
            heightAsString = JOptionPane.showInputDialog("Please Enter The Height Of Person" + i);
            height[i] = Double.parseDouble(heightAsString);

            if(height[i] > 1.8){
                over18 += 1;
            }

            if(height[i] < 1.6){
                under16 += 1;
            }
        }

        JOptionPane.showMessageDialog(null,"The Total Number Of People Over 1.8m Is:" + over18 +
       "
The Total Number Of People Under 1.6m Is:"
+ under16);
    }
}


改成

1
2
i = 0; i < height.length
    ↑    ↑

数组在Java中从零开始。这意味着,如果您有一个数组,数组的大小为N,则索引的范围将为[0, N - 1],请参见Java?教程-数组:

Each item in an array is called an element, and each element is accessed by its numerical index. As shown in the preceding illustration, numbering begins with 0. The 9th element, for example, would therefore be accessed at index 8.

如果您有兴趣(推荐),请阅读JLS-第10章。数组:

If an array has n components, we say n is the length of the array; the components of the array are referenced using integer indices from 0 to n - 1, inclusive.


1
2
3
4
5
6
7
8
9
10
11
12
for(i = 1; i <= height.length; i++){
        heightAsString = JOptionPane.showInputDialog("Please Enter The Height Of Person" + i);
        height[i-1] = Double.parseDouble(heightAsString);

        if(height[i-1] > 1.8){
            over18 += 1;
        }

        if(height[i-1] < 1.6){
            under16 += 1;
        }
    }

使用height [i-1],因为数组索引从0开始。


问题出在循环的i <= height.length状态下的=

1
 for(i = 1; i <= height.length; i++){

改成

1
 for(i = 0; i < height.length; i++){

height.length将为您提供数组中元素的数量,并且数组索引从0开始至结束height.length-1,因此在循环的最后一次迭代中,您尝试访问不存在的数组height.length索引,这给了您例外。


更改以下代码行

1
for(i = 1; i <= height.length; i++){

通过以下方法解决您遇到的两个问题:

1
for(i = 0; i < height.length; i++){

代码第一行的问题是您缺少数组的第一个位置(i = 0)。由于每个数组都从0位置开始,所以您的最后一个索引不能等于数组的长度,而是要少1个索引,这就是为什么索引超出范围错误的原因。

为了更好地理解,请考虑以下三个位置数组:
[0] [1] [2]。

它的长度为3,因为分配了3个内存空间。
但是,要访问内存的最后空间,您必须使用索引2,而不是长度3。由于应该使用i


在java中,数组索引从零开始。
因此,如果您声明一个数组,例如

double height[] = new double[10];

它的索引从零开始,到9结束。

但是在您的代码中,索引变量(i)从1开始,以10(height.length)结尾。这会导致两个问题,因此,您缺少数组中的第一个元素(第0个),并试图获取第10个元素(不存在),并且它引发了数组索引超出界限异常。
更改for循环,使其从零开始,到9结束。

for(i = 0; i < height.length; i++)


问题不在for循环声明中,而是在以下行中:

1
height[i] = Double.parseDouble(heightAsString);

您将从1的for循环i值开始,已声明数组具有10项,索引从0到9。

结果,当您尝试分配索引值10时,会收到索引超出范围错误。

这将解决:

1
height[i-1] = Double.parseDouble(heightAsString);


数组总是从零开始索引,因此建议您使用整洁的数组,不要绕开它并按原样使用它。

因此,您的代码存在两个问题-首先是您从一个代码开始,这不会引发异常,但这不是一个好方法。

其次,由于索引从零开始,您达到了数组的限制(使用索引从0到9访问大小为10的数组)。

您的代码应如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
    for(i = 0; i < height.length; i++){
        heightAsString = JOptionPane.showInputDialog("Please Enter The Height Of Person" + (i+1));
        height[i] = Double.parseDouble(heightAsString);

        if(height[i] > 1.8){
            over18 += 1;
        }

        if(height[i] < 1.6){
            under16 += 1;
        }
    }