【问题标题】: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?

【问题讨论】:

  • 实际上,如果没有数组,ArrayIndexOutOfBoundsException 就不是一个好的选择。然而,有一个更通用的IndexOutOfBoundsException 非常适合这种情况。在这里查看:docs.oracle.com/javase/7/docs/api/java/lang/…

标签: 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);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2020-09-04
            • 2015-11-05
            • 2016-04-24
            • 1970-01-01
            • 2018-02-04
            • 1970-01-01
            • 1970-01-01
            • 2021-09-03
            相关资源
            最近更新 更多