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 < temps.length
和 temps[i+1]
当 i 等于 temps.length -1(循环的最后一次迭代)时,i+1 将等于 temps.length。这意味着当数组有 10 个元素时,您正在尝试访问数组 [10]。但是数组只包含 0 到 9 作为索引。
将i < temps.length
更改为i < 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】:由于您的循环变量i
从0
变为temps.length - 1
(因为<
)并且您在正文中
temps[i+1]
当i
取temps.length - 1
的值(它可以取的最后一个值),当你到达时
temps[temps.length - 1 + 1]
是一样的
temps[temps.length]
它会引发异常,因为数组只能从0
访问到length - 1
。
如何解决?您可以尝试减少1
中i
的最后一个值。换句话说:
for(int i = 0; i < temps.length - 1; i++)
【讨论】:
【参考方案4】:temps[i+1] 是问题
当 i 是最后一个索引时,i+1 将给出异常。
【讨论】:
以上是关于ArrayIndexOutOfBoundsException,同时找到数组中两个连续元素之间的最大差异的主要内容,如果未能解决你的问题,请参考以下文章