应该检查IndexOutOfBoundsException吗?

时间:2013-12-17 16:35:18

标签: java

我最近找到了一个错误,其中列表的长度为0,但是在第1位进行了访问尝试

System.out.println("key is " + keyValuesPairs.get(0)+ " , value is " + keyValuesPairs.get(1));

这会导致IndexOutOfBoundsException,但由于没有捕获,因此会以静默方式删除异常,并且不会指示抛出异常。出于这个原因,IndexOutOfBoundsException应该是一个检查过的异常,因为它可能导致很难找到错误吗?

更新:不会以静默方式删除异常。

6 个答案:

答案 0 :(得分:5)

你的问题不是我是否应该捕获此异常?它是为什么这个异常被消除未报告?

代码中确实存在错误,但另一个错误 - 隐藏的错误正在悄然消耗您的异常并丢弃它 - 是一个更有害的错误。

这就是为什么

...
} catch (Exception e) {
  // Ignore it.
}

几乎总是代码气味。

答案 1 :(得分:2)

不,我不应该被抓住。这是一个运行时异常,请参阅此链接以获取更多详细信息:http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

您可以做的是针对数组长度

测试您正在使用的索引

答案 2 :(得分:1)

我不会抓住那个例外。相反,我只是检查这样的界限:

if(keyValuesPairs.size() > 0) {...}

答案 3 :(得分:1)

你已经回答了这个问题:

"我最近找到了一个错误,其中列表的长度为0,但是在位置1进行了访问尝试。"

这是代码中的一个错误 - 您需要解决的问题是,甚至可以使用大于数组的索引。这不是一个检查异常的原因(这意味着Java不需要你捕获它)。这个原因是您无法知道为什么在发生错误时使用了错误的索引,并且无法从中正常恢复。

您应该修复找到的错误,而不是捕获异常。使它不再被抛出异常。

答案 4 :(得分:1)

所有RuntimeException都是理想情况下永远不需要发生的事情。它们是在程序对未知程序不够谨慎的情况下引起的,并且试图做一些没有理智的方法应该考虑的事情,并且使用对象和方法它们只有最浅的一瞥。

有时候,一个方法被一个邪恶的主人无意间欺骗去尝试一些它不应该采取null或空数组的东西,即使该方法的文档表明它没有资格处理这些事情。但更糟糕的是,当主人得知他们的计划失败时,有些人会试图掩盖他们的失败,通过在异常到达上级之前拦截异常,以懒惰和邋cor腐败系统。即使主人有适当的方法来处理他们的失败,他们仍然浪费了由这种障碍引起的额外资源和处理能力。

故事的寓意:不要写坏代码。

答案 5 :(得分:0)

不应该检查它,因为如果要检查它,那么List界面和其他界面需要更改为将throws添加到过度杀伤的方法中。

应抛出IndexOutOfBoundsExceptionNullPointerException之类的异常,然后再抛出它们。这些例外是RuntimeException,可能在应用程序运行时发生,具体取决于数据而非故意。发生这些异常的情况是不可预测的,并且无法说明代码是否抛出异常。这就是它应该是运行时异常的原因。

在您的代码中,要成为有效代码,您应该在使用任意索引访问列表元素之前检查索引的边界。使用isEmpty()size()来获取纠正流量的条件。