尝试反转数组时ArrayIndexOutOfBoundsException

时间:2014-02-20 13:32:14

标签: java arrays

这看起来很简单,但我收到错误"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at reverse.main(reverse.java:28)"

我最初从用户那里获取输入来编写数组,然后我想向后打印数组。我知道还有其他方法可以做到这一点,但我主要想知道为什么这不起作用。逐行完成它是有道理的吗?

PS。如果这不是问题,有没有更好的方法呢?

import java.util.Scanner;


public class reverse {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.printf("Enter the number of values in array: ");
        Scanner scanner = new Scanner(System.in);
        int n;
        n = scanner.nextInt();

        double[] a1 = new double[n];
        int i;

        System.out.printf("Enter the value in the array: ");
        for (i = 0; i < n; i++){
            Scanner scanner2 = new Scanner(System.in);
            a1[i] = scanner2.nextInt();
            }
         double j;
         double k;

            for (i = 0; i < n/2; i++){
                j = a1[i];
                k = a1[n-i]; //error line;
                a1[i]=k;
                a1[n-i]=j;
            }
         for(i = 0; i < n; i++){
        System.out.println(" "+a1[i]);
    }}


}

3 个答案:

答案 0 :(得分:6)

当i = 0时,n-i将得到n,它比可用索引(0 - > n-1)大1。

for (i = 0; i < n/2; i++){
  j = a1[i];
  k = a1[n-i]; //error line;
  a1[i]=k;
  a1[n-i]=j;
}

答案 1 :(得分:0)

Collections.reverse(Arrays.asList(array))

将为您反转数组,然后只打印其值。将这些问题作为练习来做是很棒的,但是如果你在业内工作,通常最好依靠Java API来处理这样的微不足道的事情。可能会比你想出的任何东西更快,更简单。

答案 2 :(得分:0)

正如Samhain所说,当i = 0,然后是n-i == n时,它大于数组的最后一个索引(因为数组以索引0开头)。

最简单的解决方案是从n-i中减去额外的1。

j = a1[i];
k = a1[n-i-1];
a1[i]=k;
a1[n-i-1]=j;

此外,创建新的Scanner完全没必要。继续使用您创建的第一个。

for (i = 0; i < n; i++){
    a1[i] = scanner.nextInt();
}

最后,对于它的价值,如果您使用的是nextInt,则无需将您的数组声明为double[](也不要jk需要双打)。你可以使用整数。

这是在ideone上运行的。