Victor
Victor

Reputation: 1271

Preventing Index Out of Range Error

I want to write a check for some conditions without having to use try/catch and I want to avoid the possibilities of getting Index Out of Range errors

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

So the problem I am facing is that in the second check I need to see whether I have one Item that is not empty. However, If I don't have Element[1], I get the Index Out of Range exception. The problem is that there could be 2 Elements and one(or both) of them may have empty Object arrays. The code will have to be executed only if one of thos Item strings is not empty.

Hopefully, I explained it well. How do I go about avoiding getting that exception under any condition?

Upvotes: 10

Views: 50969

Answers (7)

jber Ibra
jber Ibra

Reputation: 71

Could use a LINQ method ElementAtOrDefault(index)

so if the element is not found it will be null.

var currentElem = Elems.ElementAtOrDefault(i);

if(currentElem != null) 
     // do something
else
   // do something

Upvotes: 4

Dawit Selesh
Dawit Selesh

Reputation: 1

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

Upvotes: 0

deltree
deltree

Reputation: 3824

Alright, you need some better null checking and some more cautious code here.

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

is just unacceptable.

First, let's null check

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

for simplicity, you could use &&

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

then, inside that if, we use a for loop (since you're stuck on arrays) and null check it

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

then, since you have nested arrays, we loop again. This is called a nested loop, and it's generally bad practice, I'll show you why it works in a second.

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))
    {

Now, with all of that ugly nested loopyness, we've found out that your Item is not null. On top of that, you have access to ALL of the potential values here, and can group them as you like. Here's how I would put the whole thing together for simplification.

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
}

Upvotes: 4

Kevin P. Rice
Kevin P. Rice

Reputation: 5743

Place both tests together using the short-circuit && so that the second test doesn't occur if the first fails:

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)))
{
    // ...
}

I am presuming it is Object[1] causing the exception--you weren't clear on that. If it is Element[1] that causes the exception (or both), then you need to pre-test the length of the array:

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

Upvotes: 0

Patrick G
Patrick G

Reputation: 196

I think you can put your check in right before your first if Check.

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

This should just short-circuit out if your array doesn't have both Elements.

Upvotes: 0

nothrow
nothrow

Reputation: 16168

Your code is probably subject to refactor.

I assume it can work this way:

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

Upvotes: 0

Ryan
Ryan

Reputation: 1141

Could you do something like:

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

Upvotes: -1

Related Questions