ArrayIndexOutOfBoundsException,同时找到数组中两个连续元素之间的最大差异

Posted

技术标签:

【中文标题】ArrayIndexOutOfBoundsException,同时找到数组中两个连续元素之间的最大差异【英文标题】:ArrayIndexOutOfBoundsException while finding the maximum difference between two consecutive elements in array 【发布时间】:2014-02-15 19:41:48 【问题描述】:

我找不到一个逻辑算法来查找数组中两个连续索引之间的最大差异。当我在我的代码中使用该方法时,我的客户端页面给了我一个错误,说我有一个 outofbounds Exception。有什么建议?如果您需要更多代码,请询问。

//method returning the largest change between two consecutive days
    public int NetChange()
    
      int BiggestNet = temps[0] - temps[1];
      for( int i = 0; i < temps.length; i++ )
      
         if( (temps[i] - temps[i+1]) > BiggestNet )
         
            BiggestNet = (temps[i] - temps[i+1]);
         
      
      return BiggestNet;
      

错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
    at Forecast.NetChange(Forecast.java:105)
    at Forecast.toString(Forecast.java:120)
    at ForecastClient.main(ForecastClient.java:12

【问题讨论】:

一旦i 等于temps.length - 1(最后一次迭代),你正试图索引temps.length,因为你正在做i + 1,导致你的异常。 【参考方案1】:

问题在于这两条代码...i &lt; temps.lengthtemps[i+1]

当 i 等于 temps.length -1(循环的最后一次迭代)时,i+1 将等于 temps.length。这意味着当数组有 10 个元素时,您正在尝试访问数组 [10]。但是数组只包含 0 到 9 作为索引。

i &lt; temps.length 更改为i &lt; temps.length-1 将解决此问题..

【讨论】:

【参考方案2】:

改变

for( int i = 0; i < temps.length; i++ )

for( int i = 0; i < temps.length - 1; i++ )

temps.length 将不使用基于零的计数为您提供数组的长度,但它由基于零的索引访问。所以如果 i = temps.length - 1,那实际上是数组中的最后一个元素。如果您随后尝试访问比您的数组更长的 temps[i+1] 并因此超出范围。

【讨论】:

【参考方案3】:

由于您的循环变量i0 变为temps.length - 1(因为&lt;)并且您在正文中

temps[i+1]

itemps.length - 1 的值(它可以取的最后一个值),当你到达时

temps[temps.length - 1 + 1]

是一样的

temps[temps.length]

它会引发异常,因为数组只能从0 访问到length - 1

如何解决?您可以尝试减少1i 的最后一个值。换句话说:

for(int i = 0; i < temps.length - 1; i++)

【讨论】:

【参考方案4】:

temps[i+1] 是问题

当 i 是最后一个索引时,i+1 将给出异常。

【讨论】:

以上是关于ArrayIndexOutOfBoundsException,同时找到数组中两个连续元素之间的最大差异的主要内容,如果未能解决你的问题,请参考以下文章