0

私は次のコードを持っています:

 public List<IAction> Dispatch(string[] arg)
   {
       int time=0;
       int i = 0;
       int j = 0;
       List<IAction> t = new List<IAction>(10);
       do
       {
           if (arg[j][0] == '/') // I get index out of bounds here
           {
               Options opt = new Options();                   

               time = opt.Option(arg[j]);
               j++;
           }
           else
           {
               if (int.Parse(arg[j]) >= 0 && int.Parse(arg[j]) <= 20)
               {
                   t.Add(new ComputeParam(int.Parse(arg[j])));
                   i++;
                   j++;                      
               }
           }

       } while (i != arg.Length);
       for (int z = 0; z < t.Count; z++)
       {
           ((ComputeParam)t[z]).Time = time;
       }
       return t;
   }

なぜエラーが発生するのですか...引数を渡すだけで、それらが数値の場合はリストに追加し、そうでない場合はオプションを設定して次に進みます。ここで何が問題なのですか?

編集:引数である 2 /t:Med 2 3 を渡します。私はすでにarg [1](この場合)がnullであることを確認しましたが、そうではありません。

4

2 に答える 2

4

ここで考えられる問題がいくつか見られます。

  1. arg[]が空の場合、例外が発生します
  2. arg[j]が空の文字列の場合、例外が発生します
  3. オプションがある場合は、ループの後の実行で例外が発生します。これjは、インクリメントされているがiそうではないためです。

これで修正されると思います:

public List<IAction> Dispatch(string[] arg)
{
   int time=0;
   List<IAction> t = new List<IAction>(10);
   for (int j = 0; j < arg.Length; j++)
   {
       if (!String.IsNullOrEmpty(arg[j]) && arg[j][0] == '/')
       {
           Options opt = new Options();                   

           time = opt.Option(arg[j]);
       }
       else
       {
           if (int.Parse(arg[j]) >= 0 && int.Parse(arg[j]) <= 20)
           {
               t.Add(new ComputeParam(int.Parse(arg[j])));
               // Don't need to increment i                
           }
       }

   }
   for (int z = 0; z < t.Count; z++)
   {
       ((ComputeParam)t[z]).Time = time;
   }
   return t;
}
于 2012-08-06T13:44:34.650 に答える
2

要素のない要素にインデックスを付けようとすると、通常、配列が予想よりも小さいときに要素にインデックスを付けるときに、これが発生します。

あなたの場合、次のいずれかです。

  • jis greater than or equal to arg.Lengthsoの値arg[j]は範囲外になります。
  • の文字列にarg[j]は文字がないためarg[j][0]、範囲外にスローされます。

Length配列のプロパティを使用して長さをテストできます。stringプロパティも持っていLengthます。

余談ですがj、すべての場合にインクリメントするわけではなく、チェック以外で使用することさえないようですiが、. また、チェックは少なくともjiwhile (i != args.Length)IndexOutOfBoundsExceptionwhile (i < args.Length)

于 2012-08-06T13:42:04.163 に答える