You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:54:06