有人可以向我解释这个java.lang.ArrayIndexOutOfBoundsException

时间:2016-04-04 23:55:11

标签: java arrays

这是我的代码:

import java.util.Arrays;

public class TwelveInts {

    public static void main(String[] args) {

        int bucky[]={1,2,3,4,5,6,7,8,9,10,11,12};
        System.out.println("First to last: ");
        for(int i = 0; i<bucky.length; i++){
            System.out.print(bucky[i] + " ");
        }
        System.out.println("");

        System.out.println("Opposite order :) ");
        **for(int i = bucky.length; i >=0; i--){**
            System.out.print(bucky[i] + " ");
        }


    }

}

我意识到有问题的代码是这样的:

for(int i = bucky.length; i >=0; i--)

应该写成如下以消除异常:

for(int i = bucky.length - 1; i >=0; i--){

我只是不明白为什么。我知道原因是因为它是由于非法索引,但我只是不明白应用程序中的这个异常错误。如果有人可以帮助我理解为什么在没有“ -1”的情况下在此问题中发生此异常,那就太好了。我只是很难为此想象它。

6 个答案:

答案 0 :(得分:3)

数组和列表的索引是从0开始的。

因此,使用array[0]访问数组的第一个元素,使用array[array.length - 1]访问最后一个元素

几乎所有编程语言都使用从零开始的索引。正如Edsger Dijkstra在这里雄辩地解释的那样,有充分的理由这样做:https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

答案 1 :(得分:1)

因为索引从0开始,但是当你在寻址大小时它不计数为零,所以如果你有2个元素,第一个将在索引0处寻址,但是大小将是数组的2,所以通过说大小2你可以解决一个不存在的索引。

例如:

int [] array = {1,2,3}; //大小为3,所以array.length将返回3。 但是最后一个索引将是2,因为索引从0开始。所以如果你解决3,那么它将是一个超出范围的异常

答案 2 :(得分:1)

for(int i = bucky.length - 1; i >=0; i--)是问题,

数组和列表以索引0

开头

想象一下,你有一个String[] a = {A, B, C, D}

数组

因此数组的长度为4,因为它包含4个元素。所以a.length == 4。 但是,数组的第一个元素的索引为0(而不是1)。 因此

a[0] = A
a[1] = B
a[2] = C
a[3] = D

a[4]超出界限

答案 3 :(得分:1)

对于这个数组:

int bucky[]={1,2,3,4,5,6,7,8,9,10,11,12};

bucky.length为12(数组有12个元素)因此索引从0到11(数组总是从零开始)。不要将数组中的元素与索引本身混淆(bucky [0],bucky [1],... bucky [11])。

因此,对于反向顺序,您需要使用从11(即bucky.length-1)的索引向下遍历元素,否则for循环尝试访问bucky [bucky.length]与bucky [12]相同抛出ArrayIndexOutOfBoundsException。

答案 4 :(得分:1)

您的数组bucky[]={1,2,3,4,5,6,7,8,9,10,11,12}; 12 个元素,其长度 12 ,但您无法尝试读取元素 bucky [12] ,你可以从 bucky [0]到bucky [11] 或从 bucky [11]转到bucky [0] 你的逻辑是什么......

答案 5 :(得分:1)

for循环以i = bucky.length.开头让我解释为什么这是出界的。 数学上第n个元素在索引n-1处。第一个元素位于索引1-1(0)

如果您的数组bucky为[1,2,3,4,5],bucky[0] == 0,bucky[1] == 1等,直至bucky[4] == 5。 你的数组有5个元素,所以它的长度是5,但最后一个元素是索引4。

因此,数组中最后一个元素的索引是bucky.length-1。从这里您可以看到,如果您尝试访问bucky.length处的索引,您将访问超出数组中最后一个索引的索引。 您的for循环以i = bucky.length开头,因此为什么以i=bucky.length-1启动它可以解决问题。