这是我的代码:
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”的情况下在此问题中发生此异常,那就太好了。我只是很难为此想象它。
答案 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
启动它可以解决问题。