【问题标题】:Removing lowest value from an array in Java [duplicate]从Java中的数组中删除最小值[重复]
【发布时间】:2014-02-17 18:31:13
【问题描述】:

我正在尝试用 Java 编写一个程序,该程序采用三个数组并返回删除了最小值的数组。我想我创建新数组是错误的。虽然它似乎编译得很好,但每次我运行它时,我都会收到以下消息:

线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:5

任何帮助将不胜感激!

这是我的代码:

import java.util.Arrays;

class LowestGrade
{
    public static void main (String [] args)
    {
       int [] a = removeLowest (23, 90, 47, 55, 88);
       int [] b = removeLowest (85, 93, 42);
       int [] c = removeLowest (59, 92, 93, 47, 88, 47);

       System.out.println ("a = " + Arrays.toString(a));
       System.out.println ("b = " + Arrays.toString(b));
       System.out.println ("c = " + Arrays.toString(c));
    }

    public static int[] removeLowest (int...grades)
    {   
       if (grades.length <= 1)
       {
        return grades;
       }  

       else 
       {
          int [] newArray = new int [grades.length - 1];
          int lowest = grades [0];

          for (int i = 0; i < grades.length; i++)
          {
           for (int n = 0; n <= grades.length; n++)
           {
              if (grades[n] > lowest) 
              {
                 newArray[i] = grades[n];
                 i++;
              }

              else 
              {
                 lowest = grades[n];
              }
           }
          }

          return newArray;
       } 
    }
}

【问题讨论】:

  • 你认为这个错误意味着什么?没有比这更明显的错误发生原因了。
  • bug 在这里 if (grades[n] &gt; lowest) 你的 n 大于 grades 的大小。
  • 另外你为什么要使用嵌套循环?您可以在一个简单的循环中执行此操作(如果您不关心结果数组的顺序)。
  • 你了解调试的概念吗??

标签: java arrays indexoutofboundsexception


【解决方案1】:

您可能应该发布整个异常:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
    at LowestGrade.removeLowest(LowestGrade.java:32)
    at LowestGrade.main(LowestGrade.java:7)

这意味着您正在访问一个少于 6 个元素的数组的第 6 个元素。在您的情况下,您的数组只有 5 个元素,其有效索引为 0、1、2、3 和 4。

解决方法是删除嵌套循环:

int lowest = grades [0];
for (int i = 1; i < grades.length; i++) 
{
    if(lowest > grades[i]) 
    {
       lowest = grades[i];
    }
}
return removeElement(grades, lowest);

..

public static int[] removeElement(int[] original, int element) 
{ 
   int[] n = new int[original.length - 1]; 
   System.arraycopy(original, 0, n, 0, element ); 
   System.arraycopy(original, element+1, n, element, original.length - element-1); 
   return n; 
}

removeElement 来自this answer

【讨论】:

    【解决方案2】:

    以下几行是一般的编程错误:

    1. newArray[i] = grades[n];

    由于newArray的大小减一,所以可以保持i = grades.length时的值。

    1. for (int n = 0; n &lt;= grades.length; n++)

    当 n = Grades.length 时,grades[n] 会抛出 ArrayIndexOutOfBoundsException 异常。所以,应该是for (int n = 0; n &lt; grades.length; n++)

    按照你的方式,你可以简化并重写方法如下:

        public static int[] removeLowest( int... grades ) {
    
            if ( grades.length <= 1 ) {
                return grades;
            }
    
            else {
    
                // find lowest first
    
                int lowest = grades[ 0 ];
    
                for ( int i = 1; i < grades.length; i++ ) {
    
                    if ( grades[ i ] < lowest ) {
                        lowest = grades[ i ];
                    }
                }
    
                // build the new array
                int[] newArray = new int[ grades.length - 1 ];
    
                for ( int i = 0, j = 0; i < grades.length; i++ ) {
    
                    if ( grades[ i ] == lowest ) {
                        continue;
                    }
    
                    newArray[ j++ ] = grades[ i ];
                }
    
                return newArray;
            }
        }
    

    【讨论】:

      【解决方案3】:

      友情提示:检查第二个for-loop 的for-loop 边界。

      【讨论】:

        猜你喜欢
        • 2016-07-29
        • 2016-10-14
        • 1970-01-01
        • 2014-04-16
        • 2014-10-10
        • 2019-10-19
        • 2012-04-20
        • 2021-07-29
        相关资源
        最近更新 更多