值超出数组界限

本文关键字:界限 数组 | 更新日期: 2023-09-27 18:20:58

我在遍历数组,有时我必须检查超出边界的值。当然,它抛出了异常,但我不想在它之后完全停止应用程序,只需跳过代码的这个元素。

这样的东西安全吗?不会导致内存泄漏?

try
{
    if (arrayName[i - 1, j].DoSomething())
         something++;
}
catch
{ // empty for purpose
}

值超出数组界限

使用if语句或类似语句比吞下异常要好得多。

您可以在此处查看有关该主题的进一步讨论:为什么空的捕获块是个坏主意?

我会检查以确保数组中的位置是有效的

if (arrayName[i - 1, j] != null) 
{
  arrayName[i - 1, j].DoSomething();
}

或者使用try/catch,但要记录它,这样它就不会永远丢失。

try
{
    if (arrayName[i - 1, j].DoSomething())
         something++;
}
catch(Exception e)
{ 
    _log.Error(e.Message);
}

不管怎样,您概述的方法虽然不是最佳实践,但不会导致内存泄漏

只需检查索引是否在范围内。GetLength返回指定维度的长度:

if (i - 1 < arrayName.GetLength(0) && j < arrayName.GetLength(1))
{
    if (arrayName[i - 1, j].DoSomething())
        something++;
}

只要您没有在try块中以异常导致资源无法释放的方式分配资源(通常通过Dispose方法),它就不会导致内存泄漏。如果是这种情况,请考虑使用using块来保证释放资源。

目前还不清楚您要做什么,但似乎您正在尝试使用异常作为一种机制,以避免明确检查数组索引是否有效。这(通常)是一件坏事,因为异常应该用于异常情况,如果输入是合理的,并且没有合理的方法来防止这种情况发生,则您不希望发生这种情况。如果您提供更多的上下文,我们可能会提出更好的方法。

此外,正如kfugsrase所说,您几乎应该始终避免使用空的和不合格的catch块,因为这些块会捕获try块中发生的任何异常,而不仅仅是您期望抛出的异常。例如,堆栈后面的某个内部方法可能会抛出一个与您自己的代码无关的完全无关的异常,它只会被吞噬。你不会更聪明,但结果是不可预测的,很可能是不正确的。

相反,您应该尝试仅对特定的异常类型使用限定的catch语句。