这段代码有啥问题?它抛出一个 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

那是你的问题。如果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

如果你在调用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 异常的主要内容,如果未能解决你的问题,请参考以下文章

如何修复java文件下载异常?

为啥尝试更改 _arr[3] 时没有抛出异常?

EnsureSuccessStatusCode 的使用和它抛出的 HttpRequestException 的处理

我在我的颤振应用程序中将 Paytm 全部用于一个 sdk。它抛出 PlatformException 错误

我试图从 sys_refcursor 获取 bulkcollect 记录并尝试使用 forall 插入另一个表,但它抛出了一条错误消息

什么可能导致 NoSuchElementException? [复制]