0

如果我有这样的方法:

public Object getObject(int i) {
    if (i >= 0 && i < objectList.size()) {
        return objectList.get(i);
    } else {
        return 
    }
}

这是处理数组索引越界错误的最佳方法,我应该在 else 语句中返回什么,null?

4

5 回答 5

3

这个问题没有绝对的答案,这取决于很多事情。但是,如果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();
}
于 2013-11-09T14:42:47.677 回答
1

没有“最佳方式”之类的东西,一切都取决于您的特定应用程序。如果“null”有点可识别(您的容器中没有空值),它可以是一个选项。在某些情况下,返回 0 可能是一个不错的选择(在处理严格的正数容器时),而在其他情况下,您可以返回元素 at i % size(因此您的容器是循环的)。一般来说 -当要求不存在的元素时返回任何东西总是有风险的。

最“频繁”的方法是引发异常而不是返回任何内容。

于 2013-11-09T14:43:15.917 回答
0

您可以实现Null Object 模式

或者你可以实现一个钳位,即如果索引为负,则返回索引处的元素,0或者如果它大于或等于大小,则返回索引处的元素size-1

但在您的特定情况下,最好的办法是引发异常。这就是List#get默认所做的,所以就这样吧。

原因是您明确要求某个索引处元素的值,即您希望它可用。如果不是,那么您用来确定该索引的逻辑一定有问题。

于 2013-11-09T14:55:21.310 回答
0

确实没有像“最好的方法”这样的东西,但你可以通过思考是什么导致它们至少不去那个点来处理异常。

public Object getObject(int i)
{
   if(objectList == null || ojbectList.size()<=i)
        return null;

    if (i >= 0 && i < objectList.size()) 
    {
        return objectList.get(i);
    }
}
于 2013-11-09T14:57:29.217 回答
0

当使用非法索引调用该方法时,我会抛出异常。为非法呼叫返回任何东西没有多大意义。

代码如下所示:

public Object getObject(int i) {
    return objectList.get(i);
}

此外,返回null使用样板空检查污染其他代码。最后,在这种情况下引发时,您与 Java 的List.get(int)规范很接近。IndexOutOfBoundsException

于 2013-11-09T14:48:58.200 回答