我该如何处理这个IndexOutOfBounds异常?

时间:2014-11-10 11:28:21

标签: java exception arraylist error-handling indexoutofboundsexception

下面有一些代码,在一些非常模糊的情况下,fromIndex变量设置为-1:

int fromIndex = 0;
if (newCurrentPeriod != null) {
    // Guard in case we are rolling back to before the start of the event.
    fromIndex = allPeriods.indexOf(newCurrentPeriod);
}  
for (Period resetPeriod : allPeriods.subList(fromIndex, toIndex)) {
    ...
}

目前,如果是fromIndex is -1,则ArrayList class will throw an IndexOutOfBounds Exception within the sublistRangeCheck method

我的查询:

我最好如何在代码中处理此异常?我应该用try catch包围它,打印堆栈跟踪并记录一些其他信息以进行调试吗?我应该在执行for循环之前防御性地检查fromPeriod是否> = 0并且如果不记录某些信息?

在代码中处理这样的场景的最佳做法是什么?

提前致谢。

3 个答案:

答案 0 :(得分:0)

理想情况下捕获IndexOutOfBounds(RuntimeException)不是一个好习惯。

运行时异常是一个异常,可能是程序员可能已经避免的。

只有在完成操作结束时才应捕获运行时异常,只是为了向用户显示发生错误的消息。

此外,运行时异常在编译时无法识别,如果只通过一个小的检查就可以识别异常的概率(如NullPointer的空检查,IndexOutofBounds的索引检查),这是一个最佳实践,减少了JVM上的开销。

添加fromIndex == -1的检查将是更好的方法,并记录发生迭代的详细信息。

答案 1 :(得分:0)

对于那些模糊的场景,我更倾向于在进入方法之前进行检查。

int fromIndex = 0;
    if (newCurrentPeriod != null) {
        // Guard in case we are rolling back to before the start of the event.
        fromIndex = allPeriods.indexOf(newCurrentPeriod);
    }  
if (fromIndex>=0)
    for (Period resetPeriod : allPeriods.subList(fromIndex, toIndex)) {
        ...
    }
else syso("print something");

答案 2 :(得分:-1)

indexOf是List Interface的一部分,文档中的定义说:

https://docs.oracle.com/javase/7/docs/api/java/util/List.html#indexOf(java.lang.Object)

  

返回:指定元素第一次出现的索引   此列表,如果此列表不包含元素

,则返回-1

更确切地说:

  

更正式地说,返回最高指数i(o == null?   get(i)== null:o.equals(get(i))),如果没有这样的索引,则为-1。

这意味着当索引为-1时,您要查找的对象不会存在于列表中。

你是否已经开始定制一个习俗" equals"你对象中的方法?如果没有,列表Impl。使用对象的实例id来匹配它们,这意味着包含相同数据的该对象的两个实例仍然不同,因为它们不是同一个实例!

因此,如果您确定要查找的对象位于列表中,请检查您的"等于"方法或实现一个基于输入而不是实例来比较对象的方法。

如果搜索到的对象可能不在列表中,那么您只需要处理不需要获取子列表的情况。

if (formIndex >= 0) {
        for (Period resetPeriod : allPeriods.subList(fromIndex, toIndex)) {
            ...
        }
}