Java 抛出错误消息:索引超出界限异常

Java 抛出错误消息:索引超出界限异常,java,junit,indexoutofboundsexception,Java,Junit,Indexoutofboundsexception,对于下面的代码,我得到了一个索引越界异常,我不知道为什么。非常感谢您的帮助 public Rabbit nearestRabbit() { List<Rabbit> rabbits = this.getWorld().getObjects(Rabbit.class); if (this.getWorld().getObjects(Rabbit.class) == null) { return null; } Rabbit nea

对于下面的代码,我得到了一个索引越界异常,我不知道为什么。非常感谢您的帮助

public Rabbit nearestRabbit()
{
    List<Rabbit> rabbits = this.getWorld().getObjects(Rabbit.class);
    if (this.getWorld().getObjects(Rabbit.class) == null)
    {
        return null;
    }
    Rabbit nearest = rabbits.get(0);
    double distance = distanceTo(nearest);

    for (Rabbit rabbit : rabbits)
    {
        double thisDistance = distanceTo(rabbit);
        if (thisDistance > distance)
        {
            distance = thisDistance;
            nearest = rabbit;
        }
    }
    return nearest; //@@@@@@@
}
public-Rabbit()
{
List rabbts=this.getWorld().getObjects(Rabbit.class);
if(this.getWorld().getObjects(Rabbit.class)==null)
{
返回null;
}
最近的兔子=兔子。获取(0);
双距离=距离(最近);
用于(兔子:兔子)
{
此距离加倍=距离(兔子);
如果(此距离>距离)
{
距离=此距离;
最近的=兔子;
}
}
最近的返回//@@@@@@@
}

这主要是由于您的列表大小,我知道您已为列表选中了null,但由于列表不是
null
,因此大小为
0
的列表仍然可以为空,并且您无法访问索引
0
处的元素。
我建议您检查列表大小。

在if中添加大小检查

if (this.getWorld().getObjects(Rabbit.class) == null || rabbits.isEmpty() )
列表可能不是空的,但仍然是空的。例如,任何新生成的:

LinkedList<Object> objs = new LinkedList<>();
System.out.println(objs != null && objs.isEmpty()); //true
LinkedList objs=新建LinkedList();
System.out.println(objs!=null&&objs.isEmpty())//真的

通过不检查索引是否在调用
rabbts.get(0)
的范围内,您将获得此异常

一个简单的解决方法是将此代码放在第一位

if (rabbits.isEmpty())
    return null;
这将在进行任何其他调用之前检查列表是否为空


另外,最好不要多次引用
this.getWorld().getObjects(Rabbit.class)
,尤其是在将其作为一个更容易访问的变量保存之后。

您的IndexAutofBound可能是在索引0处获取元素时,其中列表可能为空

if (!rabbits.isEmpty())
{
    Rabbit nearest = rabbits.get(0);
}

你从哪里得到的错误?从
rabbits.get(0)
?在Rabbit nextest=rabbits.get(0)您的if语句应该是
rabbits==null | | | rabbits.isEmpty()
而不是
this.getWorld().getObjects(Rabbit.class)==null