我最近找到了一个错误,其中列表的长度为0,但是在第1位进行了访问尝试
System.out.println("key is " + keyValuesPairs.get(0)+ " , value is " + keyValuesPairs.get(1));
这会导致IndexOutOfBoundsException
,但由于没有捕获,因此会以静默方式删除异常,并且不会指示抛出异常。出于这个原因,IndexOutOfBoundsException
应该是一个检查过的异常,因为它可能导致很难找到错误吗?
更新:不会以静默方式删除异常。
答案 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
添加到过度杀伤的方法中。
应抛出IndexOutOfBoundsException
或NullPointerException
之类的异常,然后再抛出它们。这些例外是RuntimeException
,可能在应用程序运行时发生,具体取决于数据而非故意。发生这些异常的情况是不可预测的,并且无法说明代码是否抛出异常。这就是它应该是运行时异常的原因。
在您的代码中,要成为有效代码,您应该在使用任意索引访问列表元素之前检查索引的边界。使用isEmpty()
或size()
来获取纠正流量的条件。