以下代码抛出异常:
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
答案 0 :(得分:4)
索引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
,如果调用者过于频繁地调用该方法,则不是例外情况。)
重新更新:
以下调用异常抛出行:
null
如果您在过于频繁地致电getNextTime
时需要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
的任何内容可能会在与调用@
的任何内容不同的线程上运行,那么您需要添加一些同步...