【问题标题】:Value out of array bounds值超出数组范围
【发布时间】:2012-01-22 16:38:11
【问题描述】:

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

这样的事情安全且不会导致内存泄漏吗?

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

【问题讨论】:

  • 至少不会像 C++ 那样导致内存泄漏。您最好检查天气,您可以调用该方法,即空参考检查或其他东西。和/或建议检查数组边界。

标签: c# arrays exception-handling


【解决方案1】:

最好使用 if 语句或类似语句,而不是吞下异常。

您可以在此处查看有关该主题的进一步讨论: Why are empty catch blocks a bad idea?

【讨论】:

    【解决方案2】:

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

    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);
    }
    

    无论如何,您概述的方法虽然不是最佳实践,但不会导致内存泄漏

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-18
          • 1970-01-01
          • 2011-08-02
          • 1970-01-01
          • 1970-01-01
          • 2022-11-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多