如果我有这样的方法:
public Object getObject(int i) {
if (i >= 0 && i < objectList.size()) {
return objectList.get(i);
} else {
return
}
}
这是处理数组索引越界错误的最佳方法,我应该在 else 语句中返回什么,null?
如果我有这样的方法:
public Object getObject(int i) {
if (i >= 0 && i < objectList.size()) {
return objectList.get(i);
} else {
return
}
}
这是处理数组索引越界错误的最佳方法,我应该在 else 语句中返回什么,null?
这个问题没有绝对的答案,这取决于很多事情。但是,如果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();
}
没有“最佳方式”之类的东西,一切都取决于您的特定应用程序。如果“null”有点可识别(您的容器中没有空值),它可以是一个选项。在某些情况下,返回 0 可能是一个不错的选择(在处理严格的正数容器时),而在其他情况下,您可以返回元素 at i % size
(因此您的容器是循环的)。一般来说 -当要求不存在的元素时返回任何东西总是有风险的。
最“频繁”的方法是引发异常而不是返回任何内容。
您可以实现Null Object 模式。
或者你可以实现一个钳位,即如果索引为负,则返回索引处的元素,0
或者如果它大于或等于大小,则返回索引处的元素size-1
但在您的特定情况下,最好的办法是引发异常。这就是List#get默认所做的,所以就这样吧。
原因是您明确要求某个索引处元素的值,即您希望它可用。如果不是,那么您用来确定该索引的逻辑一定有问题。
确实没有像“最好的方法”这样的东西,但你可以通过思考是什么导致它们至少不去那个点来处理异常。
public Object getObject(int i)
{
if(objectList == null || ojbectList.size()<=i)
return null;
if (i >= 0 && i < objectList.size())
{
return objectList.get(i);
}
}
当使用非法索引调用该方法时,我会抛出异常。为非法呼叫返回任何东西没有多大意义。
代码如下所示:
public Object getObject(int i) {
return objectList.get(i);
}
此外,返回null
使用样板空检查污染其他代码。最后,在这种情况下引发时,您与 Java 的List.get(int)规范很接近。IndexOutOfBoundsException