C# 未处理的异常:System.IndexOutOfRangeException:索引超出数组的边界

C# 未处理的异常:System.IndexOutOfRangeException:索引超出数组的边界,c#,C#,我在其他线程中看到了这个错误的几个答案,但我想知道这是如何具体应用于我的代码的。您输入2个参数,它将添加或减去它们。(例如:calc.exe add 2 2)当我按q退出程序时,我得到以下信息: 未处理的异常:System.IndexOutOfRangeException:索引为 位于Calc.Calc.Main(字符串[]args)的数组边界之外 有人能解释一下我在代码中哪里出错了以及如何修复它吗?谢谢 using System; namespace Calc { public cl

我在其他线程中看到了这个错误的几个答案,但我想知道这是如何具体应用于我的代码的。您输入2个参数,它将添加或减去它们。(例如:calc.exe add 2 2)当我按q退出程序时,我得到以下信息:


未处理的异常:System.IndexOutOfRangeException:索引为 位于Calc.Calc.Main(字符串[]args)的数组边界之外

有人能解释一下我在代码中哪里出错了以及如何修复它吗?谢谢

using System;

namespace Calc
{
    public class Calc
    {
        // Calc app
        /// <summary>
        /// Calc app: 
        /// Actions: add, sub, multi, div
        /// Param: calc action value 1, value 2
        /// </summary>
        /// <param name="args"></param>
        public static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                string ops = args[0];
                string input1 = args[1];
                string input2 = args[2];

                while (ops != "q")
                {
                    Console.WriteLine("Ready");
                    if (ops == "add")
                    {
                        Add(input1, input2);
                    }
                    else if (ops == "sub")
                    {
                        Sub(input1, input2);
                    }
                    else
                    {
                        Console.WriteLine("Operation not supported: [" + ops + "]");
                        Console.WriteLine("Try again.");
                    }


                    string[] inputs = Console.ReadLine().Split(' ');
                    ops = inputs[0];
                    input1 = inputs[1];
                    input2 = inputs[2];

                }

                // exit the app
                return;
            }

            // no argument was provided
            Console.WriteLine("Show help!");


            Console.ReadKey();

        } //main end

        public static void Add(string val1, string val2)
        {
            int num1 = Convert.ToInt32(val1);
            int num2 = Convert.ToInt32(val2);
            Console.WriteLine("Result: {0} ", num1 + num2);
        }

        public static void Sub(string val1, string val2)
        {
            int num1 = Convert.ToInt32(val1);
            int num2 = Convert.ToInt32(val2);
            Console.WriteLine("Result: {0} ", num1 - num2);
        }
    } 
}
使用系统;
名称空间计算
{
公共类计算
{
//计算应用程序
/// 
///计算应用程序:
///操作:添加、子、多、div
///参数:计算操作值1,值2
/// 
/// 
公共静态void Main(字符串[]args)
{
如果(args.Length>0)
{
字符串ops=args[0];
字符串input1=args[1];
字符串input2=args[2];
while(ops!=“q”)
{
控制台。写入线(“就绪”);
如果(操作==“添加”)
{
添加(输入1,输入2);
}
否则,如果(操作=“子”)
{
子(输入1、输入2);
}
其他的
{
Console.WriteLine(“不支持的操作:[“+ops+”]”);
Console.WriteLine(“重试”);
}
string[]inputs=Console.ReadLine().Split(“”);
ops=输入[0];
input1=输入[1];
input2=输入[2];
}
//退出应用程序
返回;
}
//没有提供任何论据
控制台。WriteLine(“显示帮助!”);
Console.ReadKey();
}//主端
公共静态void Add(字符串val1、字符串val2)
{
int num1=转换为32(val1);
int num2=转换为32(val2);
WriteLine(“结果:{0}”,num1+num2);
}
公共静态无效子对象(字符串val1、字符串val2)
{
int num1=转换为32(val1);
int num2=转换为32(val2);
WriteLine(“结果:{0}”,num1-num2);
}
} 
}

您必须检查args是否有那么多的值,就像您检查args一样。长度>0时,还要先检查args[1]和args[2]

您正在获取和IndexOutfrange异常,因为在运行的程序的某个点上,您没有给它3个值,可能是在您键入“q”的情况下,它希望再存在2个值,但它们不存在。使其在尝试使用之前检查是否存在,或者用try catch包装它,并在catch中设置默认值

编辑:这将是沿着以下思路的东西,未经测试:

try{
    string input1 = args[1];
}
catch (System.IndexOutOfRangeException ex)
{
    string input1 = '';
}


您还可以使用命令行参数解析器使应用程序更干净,类似于这样的内容

调试器告诉您什么?System.IndexOutorFrangeException未经处理消息:calc.exe中发生了类型为“System.IndexOutorFrangeException”的未经处理的异常附加信息:索引超出了数组的边界。它应该向您显示发生此情况的确切行以及值这是新的。当我按q键时,我得到“calc.exe已停止工作”异常,然后它询问我是否要调试。我给您的信息是在我选择“调试”后在visual studio中显示的信息。。有没有其他方法可以像您所说的那样获得精确的行和值?从一开始就在调试器中运行程序会更容易。在VisualStudio中,它与F5一样简单,而不是ctrl-F5。您介意用一些示例来说明如何使用try-catch和where吗?我能够调试并发现它在
input1=input[1]行
停止,并显示“索引超出了数组的界限”消息。如果(args.Length>0和条件和条件),我可以做类似于
的事情吗?