数组索引超出界限异常

时间:2015-04-21 14:45:06

标签: java

一直在四处寻找,看看是否有什么可以帮助我,但我不太了解人们的回答,我所理解的任何事情似乎都无法解决问题!所以基本上就像标题所说的那样,我得到一个超出界限的数组索引,我不明白为什么。非常感谢任何帮助。

代码:

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 +
        "\nThe Total Number Of People Under 1.6m Is: " + under16);
    }
}

7 个答案:

答案 0 :(得分:6)

更改为

i = 0; i < height.length
    ↑    ↑

Java中的数组从零开始。这意味着如果您有一个大小为N的数组,索引将在[0, N - 1]范围内,请参阅The Java™ Tutorials - Arrays

  

数组中的每个项都称为元素,每个元素都由其数字索引访问。如上图所示,编号从0开始。例如,第9个元素将在索引8处访问。

如果您有兴趣(推荐),请同时浏览JLS - Chapter 10. Arrays

  

如果一个数组有n个组件,我们说n是数组的长度;使用整数索引从0到n - 1 (包括0和n - 1 )引用数组的组件。

答案 1 :(得分:3)

问题出在=循环的i <= height.length条件

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

更改为

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

height.length将为您提供数组和数组索引中的元素数量从0开始到结束height.length-1所以在循环的最后一次迭代中,您尝试访问{{1}不存在的数组索引给你height.length例外。

答案 2 :(得分:3)

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开始。

答案 3 :(得分:0)

数组始终从零开始索引,因此建议使用它并清理,不要绕过它并按原样使用它。

所以你的代码有两个问题 - 首先是你从一个开始,它不会抛出异常,但这不是好方法。

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

您的代码应如下所示:

    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;
        }
    }

答案 4 :(得分:0)

问题不在for循环声明中,它在这一行:

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

你开始你的for循环i值为1,你已经声明你的数组有10个项目,索引从0到9。

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

这将解决:

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

答案 5 :(得分:0)

在java数组中索引从零开始。 所以如果你声明一个类似

的数组

double height[] = new double[10];

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

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

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

答案 6 :(得分:0)

更改以下代码行

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

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

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

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

为了更好地理解您认为您有以下3个位置数组: [0] [1] [2]。

长度为3,因为分配了3个内存空间。 但是,要访问内存的最后一个空间,您必须使用索引2,而不是3作为长度。由于 i&lt;应该使用height.length 而不是 i&lt; = height.length ,这样你就可以了。 index永远不会是长度,永远不会让索引超出绑定错误。