Java ArrayIndexOutOfBoundsException从数组打印值时发生异常

Java ArrayIndexOutOfBoundsException从数组打印值时发生异常,java,arrays,for-loop,Java,Arrays,For Loop,用户输入值后,程序应打印出存储在大小为5的数组中的值 这是我的密码: import java.util.Scanner; public class Arrays_Qu1 { public static void main(String[] args) { Scanner sc= new Scanner(System.in); int arr[]= new int [5]; System.out.println("Enter a number"); i

用户输入值后,程序应打印出存储在大小为5的数组中的值

这是我的密码:

import java.util.Scanner;

public class Arrays_Qu1 {

  public static void main(String[] args) {

    Scanner sc= new Scanner(System.in);
    int arr[]= new int [5];

    System.out.println("Enter a number");

    int i;
    for (i=0;i<arr.length;i++) {
      arr[i]=sc.nextInt();
    }

    System.out.println(arr[i]);
  }
}
import java.util.Scanner;
公共类数组_Qu1{
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
int arr[]=新的int[5];
System.out.println(“输入一个数字”);
int i;

对于(i=0;i,因为您在循环外打印,并且它正在尝试打印超出数组边界的arr[5]。如果要打印每个元素,则打印应该在循环中

int i;
for (i = 0; i < arr.length; i++) {
    arr[i] = sc.nextInt();
    System.out.println(arr[i]); // to print each element
}

// value of i is now 5, so arr[i] is invalid
System.out.println(arr[i-1]); // to print last element
System.out.println(Arrays.toString(arr)); // to print whole array
inti;
对于(i=0;i
因为您在循环外打印,而它正试图打印超出数组边界的arr[5]。如果要打印每个元素,则打印应该在循环中

int i;
for (i = 0; i < arr.length; i++) {
    arr[i] = sc.nextInt();
    System.out.println(arr[i]); // to print each element
}

// value of i is now 5, so arr[i] is invalid
System.out.println(arr[i-1]); // to print last element
System.out.println(Arrays.toString(arr)); // to print whole array
inti;
对于(i=0;i
您应该访问数组的最后一个元素,如:

 System.out.println(arr[i - 1])
但我相信打印数组的最后一个元素不是你想要的。所以你应该移动行

 System.out.println(arr[i])

在for循环中,它应该是正常的。

您应该访问数组的最后一个元素,如:

 System.out.println(arr[i - 1])
但我相信打印数组的最后一个元素不是你想要的。所以你应该移动行

 System.out.println(arr[i])

在for循环中,应该可以。

循环后
i
的值是多少?调试代码,您会看到
i
在循环后将是5,超出索引边界[0,4]。这是因为循环在检查条件之前将增加
i
,即它将增加
i
到5,然后检查
i
(即
i<5
)然后终止循环-但是
i
仍然是5。i++执行的次数比您想象的要多;在循环的最后一次迭代中,就在数组[]赋值之后。@Thomas谢谢,这是一个有用的解释!这应该在任何体面的循环教程中解释,但基本上是这样的:
for(init;condition;increment){body;}
产生一个序列,如
init,条件检查,body,increment,条件检查,body,increment,…
-当然,如果条件检查失败,该序列将结束。:)循环后
i
的值是多少?调试代码,您将看到
i
在循环后将是5,超出索引边界[0,4]。这是因为循环在检查条件之前将增加
i
,即它将增加
i
到5,然后检查
i
(即,
i<5
)并终止循环-但
i
仍然是5。i++执行的次数比您想象的要多;在循环的最后一次迭代中,数组[]赋值之后。@Thomas谢谢,这是一个很有帮助的解释!这应该在任何像样的循环教程中解释,但基本上是这样的:
(init;condition;increment){body;}
生成一个序列,如
init,condition check,body,increment,condition check,body,increment,…
-当然,如果条件检查失败,序列将结束。:)