【问题标题】:What to return when the requested index is out of bounds当请求的索引超出范围时返回什么
【发布时间】:2013-11-09 14:41:17
【问题描述】:
如果我有这样的方法:
public Object getObject(int i) {
if (i >= 0 && i < objectList.size()) {
return objectList.get(i);
} else {
return
}
}
这是处理数组索引越界错误的最佳方法吗,我应该在 else 语句中返回什么,null?
【问题讨论】:
标签:
java
arraylist
return-value
indexoutofboundsexception
【解决方案1】:
这个问题没有绝对的答案,这取决于很多事情。但是,如果null 不是合法值,我将返回null,如果它是合法值,我将throw 异常。
/**
* ...
* @return The element at index i, null if out of bounds.
*/
public Object getObject(int i) {
if (i >= 0 && i < objectList.size()) {
return objectList.get(i);
}
return null;
}
或者如果null 是合法值:
public Object getObject(int i) throw IndexOutOfBoundsException {
if (i >= 0 && i < objectList.size()) {
return objectList.get(i);
}
throw new IndexOutOfBoundsException();
}
【解决方案2】:
没有“最好的方法”之类的东西,一切都取决于您的特定应用程序。如果“null”有点可识别(您的容器中没有空值),它可以是一个选项。在某些情况下,返回 0 可能是一个不错的选择(在处理严格的正数容器时),而在其他情况下,您可以在 i % size 处返回元素(因此您的容器是循环的)。一般来说 - 当被要求提供不存在的元素时,返回 anything 总是有风险的。
最“频繁”的方法是引发异常而不是返回任何内容。
【解决方案3】:
您可以实现Null Object pattern。
或者你可以实现一个clamp,即如果索引为负,则返回索引0处的元素,或者如果它大于或等于size,则返回索引size-1处的元素
但在您的特定情况下,最好的办法是引发异常。这就是List#get 默认所做的,所以就这样吧。
原因是您明确要求某个索引处元素的值,即您希望它可用。如果不是,那么您用来确定该索引的逻辑一定有问题。
【解决方案4】:
当使用非法索引调用该方法时,我会抛出异常。为非法呼叫返回任何东西没有多大意义。
代码如下所示:
public Object getObject(int i) {
return objectList.get(i);
}
此外,返回 null 会使用样板空检查来污染其他代码。
最后,在这种情况下提升 IndexOutOfBoundsException 时,您与 Java 的 List.get(int) 列表规范非常接近。
【解决方案5】:
确实没有“最佳方式”之类的东西,但您可以通过思考是什么导致异常至少无法到达该点来处理异常。
public Object getObject(int i)
{
if(objectList == null || ojbectList.size()<=i)
return null;
if (i >= 0 && i < objectList.size())
{
return objectList.get(i);
}
}