【问题标题】:ArrayOutOfBoundsException in javajava中的ArrayOutOfBoundsException
【发布时间】:2017-05-14 12:56:36
【问题描述】:

我在 Java 中有以下代码。

public class TestArray
{
    public static void main(String s[])
    {

        int arr[]={23,12,1,4,1,4,23,6};
        int temp=arr[0];

        for(int i=0;i<arr.length;i++)
        {
            for(int j=0;j<arr.length;j++)
            {
                if(arr[i]>arr[j+1])
                {
                    temp=arr[j+1];
                    arr[j+1]=arr[i];
                    arr[i]=temp;   
                }
                if(arr[i]==arr[j+1])
                {
                    arr[j+1]=arr[j+2];
                }
            }
       }

       for(int i=0;i<arr.length;i++)
       {
           System.out.println(arr[i]);
       }
    }
}

但是这段代码在抛出

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 8 在 com.test.java.TestArray.main(TestArray.java:16)

谁能帮我解决这个问题?

【问题讨论】:

  • 问题将在这里j+2
  • 例程的目的是什么?你想达到什么目的?要实现数组排序吗?

标签: java arrays sorting indexoutofboundsexception


【解决方案1】:

jarr.length - 1 时,尝试索引arr[j + 1]arr[j + 2] 将失败。

您是否应该将您的索引运行到比当前少一个?此外,您索引j + 2 的最后繁荣看起来没有必要。

作为一个风格点,保持temp 的范围尽可能紧凑。只有在交换两个数组元素时才需要它。

【讨论】:

    【解决方案2】:

    看起来您正在尝试按降序对数组进行排序。你可以试试这个:

    public class TestArray
    {
        public static void main(String s[])
        {
    
            int arr[]={23,12,1,4,1,4,23,6};
            int n = arr.length;  
            int temp = 0;  
            for(int i=0; i < n; i++){  
                 for(int j=1; j < (n-i); j++){  
                     if(arr[j-1] < arr[j]){  
                         //swap elements  
                         temp = arr[j-1];  
                         arr[j-1] = arr[j];  
                         arr[j] = temp;  
                     }        
                 }  
            }  
            for(int i=0;i<arr.length;i++)
            {
               System.out.println(arr[i]);
            }
        }
    }
    

    您可以理解代码。 如果你想知道你是如何得到异常的,请参考Bathsheba的回答

    【讨论】:

      【解决方案3】:

      把你的代码修改成

      for(int i=0;i<arr.length-1;i++) {
          for(int j=i;j<arr.length-1;j++) {
              if(arr[i]>arr[j+1]) {
                  temp=arr[j+1];
                  arr[j+1]=arr[i];
                  arr[i]=temp;   
              }
              if(arr[i]==arr[j+1]) {
                  arr[j+1]=arr[j+2];
              }
          }
      }
      

      在您的循环中,j 的值将从 0 到 7。您正试图访问数组的第 j+1 个位置。因此,当 j 的值为 7 时,您正在访问 a[8] 并且它不在数组大小的范围内。大小为 8 的数组将具有从 0 到 7 的索引值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-07
        • 2011-01-24
        • 2013-08-07
        • 2016-07-23
        • 1970-01-01
        相关资源
        最近更新 更多