Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否应检查IndexOutOfBoundsException?_Java - Fatal编程技术网

Java 是否应检查IndexOutOfBoundsException?

Java 是否应检查IndexOutOfBoundsException?,java,Java,我最近发现了一个bug,其中列表的长度为0,但在位置1进行了访问尝试 System.out.println("key is " + keyValuesPairs.get(0)+ " , value is " + keyValuesPairs.get(1)); 这导致了一个IndexOutOfBoundsException,但由于未捕获该异常,因此会自动删除该异常,并且不会显示抛出了异常。出于这个原因,IndexOutOfBoundsException应该是一个已检查的异常,因为它可能导致难以找

我最近发现了一个bug,其中列表的长度为0,但在位置1进行了访问尝试

System.out.println("key is " + keyValuesPairs.get(0)+ " , value is " + keyValuesPairs.get(1));
这导致了一个
IndexOutOfBoundsException
,但由于未捕获该异常,因此会自动删除该异常,并且不会显示抛出了异常。出于这个原因,
IndexOutOfBoundsException
应该是一个已检查的异常,因为它可能导致难以找到bug


更新:异常不会自动删除。

不,我不应该被捕获。这是一个运行时异常。有关详细信息,请参阅此链接:


您可以做的是根据数组长度对正在使用的索引进行测试,我不会捕获该异常。相反,我只需像这样检查边界:

if(keyValuesPairs.size() > 0) {...}
你的问题不是我应该抓住这个例外吗?这就是为什么此异常被消耗而未报告的原因

代码中确实存在一个错误,但另一个错误——隐藏的错误正在悄悄地消耗您的异常并丢弃它——是一个危害更大的错误

这就是为什么

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

几乎总是一种代码气味。

不应该检查它,因为如果要检查它,那么
列表
界面和其他界面需要更改,以添加
抛出
方法,这将是一种过激行为

在抛出异常之前,应该防止异常,如
IndexOutOfBoundsException
NullPointerException
。这些异常是
RuntimeException
,当应用程序根据数据而非故意运行时,可能会发生这些异常。这些异常发生的环境是不可预测的,并且不能说明代码是否引发异常。这就是为什么它应该是运行时异常


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

您已经回答了这个问题:

“我最近发现了一个错误,其中列表长度为0,但在位置1进行了访问尝试。”

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


您应该修复发现的bug,而不是捕获异常。使异常不再抛出。

所有
运行时异常
都是理想情况下永远不需要发生的事情。当一个程序对未知的事物没有足够的小心时,它们会试图做一些没有理智的方法应该考虑的事情,而用对象和方法,它们只有最浅的一瞥。

有时,一个方法被一个邪恶的主控者无意中诱骗去尝试它不应该尝试的事情,他强迫他们接受一个
null
或空数组,即使该方法的文档表明它没有资格处理这样的事情。但更糟糕的是,当主人得知他们的计划失败时,一些人会试图掩盖他们的失败,在异常到达上级之前拦截异常,以懒惰和草率腐蚀系统。即使主机有适当的方法来处理故障,它们仍然会浪费由无序引起的额外资源和处理能力


这个故事的寓意是:不要写糟糕的代码。

如果你真的抓到了它,你会怎么做?悄悄地从什么呼叫中删除?Ajax、EJB?为什么它会被默默地丢弃?未经检查的异常应该会产生涟漪并生成堆栈跟踪。这可能不适合这样做。检查异常与未检查异常之间的争议已经足够大了,Java文档中有一节专门讨论这个问题:在访问数据结构之前,您可以在编程中添加一个大小检查习惯用法,并注意,简单地记录它也会忽略它。@SotiriosDelimanolis-记录它而不重新引用它。