这段代码有什么问题?它抛出了IndexOutOfBounds异常

时间:2015-08-09 18:11:43

标签: java exception

以下代码抛出异常:

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

1 个答案:

答案 0 :(得分:4)

  

索引2无效,大小为2

这是你的问题。如果size2,则有效索引为01,但您出于某种原因尝试使用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的任何内容可能会在与调用@的任何内容不同的线程上运行,那么您需要添加一些同步...