这段代码有啥问题?它抛出一个 IndexOutOfBounds 异常
Posted
技术标签:
【中文标题】这段代码有啥问题?它抛出一个 IndexOutOfBounds 异常【英文标题】:Whats wrong with this code? It is throwing an IndexOutOfBounds Exception这段代码有什么问题?它抛出一个 IndexOutOfBounds 异常 【发布时间】:2015-11-01 15:29:46 【问题描述】:以下代码抛出异常:
public class Medicine
private String name;
private Double dose;
private ArrayList<Time> time = new ArrayList<Time>();
private Unit unit;
private int index = 0;
public Time getNextTime()
return time.get(index++);//it throws it in this line. It says Caused by: java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
更新 1: 好吧好吧,我正在添加更多代码。以下调用异常抛出行:
(t = medicine.getNextTime())!= null
【问题讨论】:
您期望的结果是什么?为什么? @Psherno 好吧,我截断了代码。我正在编写一个完整的 android 应用程序。泄露项目的所有类和布局文件对我来说是不合适的。所以,我想,我会删除非错误代码并粘贴类的重要部分。请注意,时间是枚举类型。 因此,根据异常消息,我们可以看到您的列表有两个元素,并且您正在尝试读取索引为2
的元素。你认为这应该可行吗(记住索引从0
开始)?
根据您添加的代码,如果您使用不正确的索引,您似乎期望 time.get(index++)
返回 null
。不幸的是,这不是真的,ArrayList.get
通过抛出 IndexOutOfBoundsException
来处理无效索引,您可以在日志中清楚地看到这一点。
【参考方案1】:
索引 2 无效,大小为 2
那是你的问题。如果size
为2
,则有效索引为0
和1
,但您出于某种原因尝试使用2
。
您还没有显示添加到time
的代码(尽管很明显有些东西是,或者您会得到Invalid index 0, size is 0
),但显然有些东西调用getNextTime
的频率高于添加到time
的任何东西。
由于getNextTime
是一个公共方法,您可能希望使其具有防御性:
public Time getNextTime()
if (index < time.size())
return time.get(index++);
throw new IllegalStateException("Blah blah blah");
(或return null
,如果调用者过于频繁地调用该方法不是例外情况。)
您的更新:
以下调用异常抛出行:
(t = medicine.getNextTime())!= null
如果你在调用getNextTime
时想要null
太频繁,那么正如我上面所说,你必须编码(上面我猜这是一个例外情况,而不是正常情况一):
public Time getNextTime()
if (index >= time.size())
return null;
return time.get(index++);
如果你真的喜欢单线:
public Time getNextTime()
return index < time.size() ? time.get(index++) : null;
我还应该注意,如果添加到 time
的任何内容可能在与调用 getNextTime
的内容不同的线程上运行,则您需要添加一些同步...
【讨论】:
咳咳。我已经在 return 语句中使用 index++ 增加了索引。 @Catfish:咳咳。这与当您只向time
添加两个条目时调用getNextTime
三次将失败的事实无关,因为索引无效。在getNextTime
中所有递增的index
都是...递增index
。这不像是在您的time
列表中神奇地填充更多条目。
@TJ 克劳德哦!所以你的意思是我的代码不应该再调用 getNextTime() 集合(ArrayList)中有对象的次数?这意味着,我必须创建第二个 hasNextTime() 方法,对吧?告诉我是的,我说你的答案是正确的!
@Catfish:我的意思是如果你想允许这样做,你必须在getNextTime
中为它编码,因为如果你问,在列表上调用.get(index)
将失败并出现该异常对于超出范围的索引。 (一般术语是“保护”对.get
的调用。)您没有必须创建hasNextTime
,但这也是一种合理的方法。
@TJ克劳德耶!我的代码正在处理您的修改。以上是关于这段代码有啥问题?它抛出一个 IndexOutOfBounds 异常的主要内容,如果未能解决你的问题,请参考以下文章
EnsureSuccessStatusCode 的使用和它抛出的 HttpRequestException 的处理
我在我的颤振应用程序中将 Paytm 全部用于一个 sdk。它抛出 PlatformException 错误
我试图从 sys_refcursor 获取 bulkcollect 记录并尝试使用 forall 插入另一个表,但它抛出了一条错误消息