下面有一些代码,在一些非常模糊的情况下,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并且如果不记录某些信息?
在代码中处理这样的场景的最佳做法是什么?
提前致谢。
答案 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)) {
...
}
}