10

try/catch を使用せずにいくつかの条件のチェックを作成し、Index Out of Range エラーが発生する可能性を回避したい

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

したがって、私が直面している問題は、2 番目のチェックで、空でないアイテムが 1 つあるかどうかを確認する必要があることです。ただし、持っていない場合はElement[1]、Index Out of Range 例外が発生します。問題は、2 つの要素があり、そのうちの 1 つ (または両方) に空のオブジェクト配列がある可能性があることです。このコードは、アイテム文字列のいずれかが空でない場合にのみ実行する必要があります。

うまくいけば、私はそれをうまく説明しました。どのような条件下でもその例外を回避するにはどうすればよいですか?

4

6 に答える 6

4

よし、ここではより良いnull チェックと、より慎重なコードが必要です。

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

受け入れられないだけです。

まず、nullチェックをしましょう

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

簡単にするために、次を使用できます&&

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

次に、そのif内で、forループを使用し(配列にこだわっているため)、nullチェックします

for (int i = 0; i < array.Element; ++i)
{
    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))
    {

さて、その醜いネストされたループのすべてで、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
}
于 2012-04-11T21:17:31.283 に答える
0

&&最初のテストが失敗した場合に2番目のテストが発生しないように、短絡を使用して両方のテストを一緒に配置します。

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);
}
于 2012-04-11T21:00:43.583 に答える
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
       }
 }

配列に両方の要素がない場合、これは短絡するだけです。

于 2012-04-11T21:05:15.403 に答える
0
for (long i = 0; i <= (output3.Length); i++)
{
    output1.WriteByte(output3[i]); -----> index out of range exception correct it
    output1.WriteByte(output3rx[i]);
}
于 2013-10-16T08:49:23.270 に答える
0

次のようなことができますか?

if(array.Element[0] != null || array.Element[1] != null){
    //execute code
}
于 2012-04-11T20:50:41.397 に答える
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
  }
}
于 2012-04-11T20:53:54.990 に答える