防止索引超出范围错误

时间:2012-04-11 20:45:50

标签: c#

我想写一些条件检查,而不必使用try / catch,我想避免索引超出范围错误的可能性

if (array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values
 {                
    if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty
       {
           // execute code here
       }
 }

所以我面临的问题是,在第二次检查时,我需要查看是否有一个非空的项目。但是,如果我没有Element[1],我会得到Index Out of Range异常。问题是可能有2个元素,其中一个(或两个)可能有空的Object数组。只有当其中一个Item字符串不为空时,才必须执行代码。

希望我能解释清楚。如何避免在任何条件下避免异常?

6 个答案:

答案 0 :(得分:3)

好的,你需要一些更好的null checking以及一些更谨慎的代码。

if (array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values
{                
   if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty
   {
       // execute code here
   }
}

是不可接受的。

首先,让我们进行空检查

if (array != null)
{
    if (array.Element != null)

为简单起见,您可以使用&&

if (array != null && array.Element != null)

然后,在if if中,我们使用for循环(since you're stuck on arrays)并将null检查

for (int i = 0; i < array.Element; ++i)
{
    if (array.Element[i] != null && array.Element[i].Object != null)
    {

然后,由于你有嵌套数组,我们再次循环。这被称为nested loop,这通常是不好的做法,我会告诉你为什么它会在一秒钟内起作用。

for (int o = 0; o < array.Element[i].Object.length; ++o)
{
    if (array.Element[i].Object[o] != null && !string.IsNullOrEmpty(array.Element[i].Object[o].Item))
    {

现在,由于所有这些丑陋的嵌套循环,我们发现你的Item不是null。 最重要的是,您可以在此处访问所有潜在值,并可以根据需要对其进行分组。以下是我将整个事情放在一起以简化的方法。

List<string> arrayValues = new List<string>();
if (array != null && array.Element != null)
{
    for (int i = 0; i < array.Element.length; ++i)
    {
        //bool found = false;
        if (array.Element[i] != null && array.Element[i].Object != null)
        {
            for (int o = 0; o < array.Element[i].Object.length; ++o)
            {
                if (array.Element[i].Object[o] != null && !string.IsNullOrEmpty(array.Element[i].Object[o].Item))
                {
                    arrayValues.Add(array.Element[i].Object[o].Item);
                    //if you want to drop out here, you put a boolean in the bottom loop and break and then break out of the bottom loop if true
                    //found = true;
                     //break;
                }
            }
        }
        //if (found)
        //  break;
    }
}
if (arrayValues.Count > 0)
{
    //do stuff with arrayValues
}

答案 1 :(得分:0)

你可以这样做:

if(array.Element[0] != null || array.Element[1] != null){
    //execute code
}

答案 2 :(得分:0)

您的代码可能需要重构。

我认为它可以这样工作:

var obj = array.Element.FirstOrDefault(x => x.Object.Length > 0);
if (obj != null)
{
  if (obj.Object[0].Item.Length != 0) 
  {
    // do whatever is necessary
  }
}

答案 3 :(得分:0)

使用短路&&将两个测试放在一起,以便在第一个测试失败时不进行第二次测试:

object element0 = array.Element[0].Object;
object element1 = array.Element[1].Object;

// Ensure at least one Object array has a non-empty value.
if ((element0.Length > 0 && !string.IsNullOrEmpty((string)element0.Object[0].Item))
    || (element1.Length > 0 && !string.IsNullOrEmpty((string)element1.Object[1].Item)))
{
    // ...
}

我认为导致异常的是Object[1] - 你不清楚这一点。如果Element[1]导致异常(或两者),那么您需要预先测试数组的长度:

if ((array.Element[0].Length != 0 && HasValue(array.Element[0].Object))
    || (array.Element[1].Length > 1 && HasValue(array.Element[1].Object)))
{
    // ...
}

// <summary>
// Returns true if the specified string array contains a non-empty value at
// the specified index.
// </summary>
private bool HasValue(System.Array array, int index)
{
    return array.Length > index && 
        !string.IsNullOrEmpty((string)array.Object[index].Item);
}

答案 4 :(得分:0)

我认为您可以在第一次检查之前将支票放入。

if (array.Length > 1 && array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values
 {                
    if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty
       {
           // execute code here
       }
 }

如果您的阵列没有两个元素,这应该只是短路。

答案 5 :(得分:0)

for (long i = 0; i <= (output3.Length); i++)
{
    output1.WriteByte(output3[i]); -----> index out of range exception correct it
    output1.WriteByte(output3rx[i]);
}