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] (在这种情况下)为空,但它不是。

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

当您尝试索引没有元素的元素时,您会得到这个,例如,通常当数组小于您的预期时您正在索引元素。

在你的情况下,要么:

  • 的值j大于或等于arg.Length所以arg[j]抛出越界。
  • in 中的字符串arg[j]没有字符,因此arg[j][0]超出范围。

Length您可以使用数组的属性测试长度。stringLength有财产。

顺便说一句,您不会j在所有情况下都增加,甚至似乎i除了在检查中之外没有使用,但j可能已经增加了,而不是i意味着您while (i != args.Length)不会保护您免受IndexOutOfBoundsException. 此外,支票至少应该是while (i < args.Length)

于 2012-08-06T13:42:04.163 回答