如何解决用户输入引发的IndexOutOfRange异常?
解决单个单词输入触发的IndexOutOfRange异常问题
嘿,我太懂这种明明想规避异常却找不到头绪的感觉了!你遇到的这个问题其实是字符串拆分后的数组访问逻辑漏洞——当用户只输入单个单词时,拆分出来的数组只有1个元素,你直接去取input[1]自然就会触发越界异常,而且这个异常完全是可以提前避免的,给你两个实用的解决方案:
方案一:拆分时限制长度+提前检查数组元素数量
首先,建议你用Split方法的重载版本,指定最多拆分成2部分,这样不管用户输入多少个空格,都只会把第一个空格前的内容作为命令,后面的所有内容作为参数(包括带空格的参数),然后在使用第二个元素前先检查数组长度:
// 按首个空格拆分,最多分成2段,保留参数里的空格 var commandTextSplitted = userInput.Split(new[] {' '}, 2); switch(commandTextSplitted[0]) { case "send": // 先判断是否有参数 if(commandTextSplitted.Length > 1) { // 处理带参数的情况,比如发送commandTextSplitted[1]的内容 Console.WriteLine($"发送内容:{commandTextSplitted[1]}"); } else { // 没有参数时给出提示,比如"请输入要发送的内容" Console.WriteLine("错误:请输入要发送的内容"); } break; case "help": // 这个命令不需要参数,直接执行逻辑 Console.WriteLine("可用命令:send [内容]、help"); break; // 其他命令的处理逻辑 }
方案二:使用Linq的ElementAtOrDefault安全获取参数
如果你习惯用Linq的话,可以用ElementAtOrDefault方法来获取第二个元素,当元素不存在时它会返回默认值(比如字符串的null),这样就不会触发异常:
using System.Linq; // 需要引用这个命名空间 var commandTextSplitted = userInput.Split(' '); var command = commandTextSplitted[0]; // 安全获取第二个元素,不存在则返回null var argument = commandTextSplitted.ElementAtOrDefault(1); switch(command) { case "open": if(string.IsNullOrEmpty(argument)) { Console.WriteLine("错误:请指定要打开的文件路径"); } else { Console.WriteLine($"尝试打开文件:{argument}"); } break; // 其他命令处理 }
其实核心思路就是永远不要假设数组一定有你要访问的索引,在使用前先做判断,这样就能从根源上避免这个异常啦!
内容的提问来源于stack exchange,提问作者Korosevar
相关产品推荐
相关产品推荐

