C#开发Telegram Bot遇text为null及数组索引越界错误求助
报错原因分析
第一个报错:NullReferenceException(text为null)
e.Message.Text 只有当收到的消息是纯文本类型时才会有值,如果Bot收到图片、语音、贴纸、群服务通知(比如成员加入、消息撤回)等非文本消息,这个属性会直接返回null,此时调用null的Split方法就会触发空引用报错。
第二个报错:IndexOutOfRangeException(数组下标越界)
你补充的代码仅处理了e.Message.Text为null的情况,但没有考虑Split后的数组长度:
- 如果用户发送的文本没有空格(比如直接发
/now、单字内容),Split(' ')返回的数组长度为1,数组下标从0开始计数,不存在下标为1的元素 - Split返回的数组元素永远不会为null,所以你加的
?? ""对这个场景完全无效
修复方案
你需要按顺序做好三层防护,修复后的完整代码如下:
private static void Client_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e) { // 1. 先过滤非文本消息,避免Text为null if (e.Message.Type != Telegram.Bot.Types.Enums.MessageType.Text) return; var id = e.Message.Chat.Id; var text = e.Message.Text.Trim(); // 2. 安全分割文本,自动移除连续空格产生的空元素 var parts = text.Split(' ', StringSplitOptions.RemoveEmptyEntries); // 3. 先判断数组长度是否足够,再取值,避免越界 if (parts.Length < 2) { // 可选:给用户发格式错误提示 // Client.SendTextMessageAsync(id, "指令格式错误,示例:/bot now"); return; } var command = parts[1]; switch (command) { case "now": var response = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Client.SendTextMessageAsync(id, response); break; // 可扩展其他命令 } }
额外说明
如果你的业务逻辑本来是要取用户发送的第一个词(比如用户直接发now就触发指令),只需要把取值的下标改为0,同时调整长度判断为parts.Length < 1即可。
内容的提问来源于stack exchange,提问作者Mah_superman3
相关产品推荐
相关产品推荐

