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

Discord.NET C#开发CommandHandler报空引用异常问题求助

报错产生原因
  • 核心赋值逻辑错误:Init方法的入参名为小写的client,但你在赋值时写的是this.Client = Client,右侧的Client是当前类未初始化的私有属性,默认值为null,相当于给类的Client属性赋值为null,后续执行Client.MessageReceived += HandleCommand时访问null对象触发空引用异常。
  • 隐藏问题:HandleCommand方法中调用Commands.ExecuteAsync未添加await关键字,直接判断IsCompleted逻辑完全错误,异步方法抛出的异常也无法正常捕获,后续运行仍会触发异常。
  • 潜在触发场景:调用Init方法时传入的client参数本身为null,也会触发同类报错。
修复方案
  1. 修正Init方法的赋值逻辑,将传入的客户端实例正确赋值给类属性:
public async Task Init(DiscordSocketClient client)
{
    // 修复赋值错误,将入参client赋值给类属性
    this.Client = client;
    Commands = new CommandService();

    await Commands.AddModulesAsync(Assembly.GetEntryAssembly(), null);
    Client.MessageReceived += HandleCommand;
}
  1. 修正命令执行的异步调用逻辑,添加await并正确判断执行结果:
private async Task HandleCommand(SocketMessage Msg)
{
    var msg = Msg as SocketUserMessage;
    if (msg == null) return;

    int argPos = 0;
    if (!(msg.HasStringPrefix("n!", ref argPos) || msg.HasMentionPrefix(Client.CurrentUser, ref argPos))) return;

    var context = new CommandContext(Client, msg);
    // 添加await关键字,等待异步方法执行完成
    var result = await Commands.ExecuteAsync(context, argPos, null);
    // 正确判断执行结果,而不是判断IsCompleted
    if (!result.IsSuccess) 
    {
        await context.Channel.SendMessageAsync($"命令执行失败:{result.ErrorReason}");
    }
}
  1. 调用Init方法前,确保传入的DiscordSocketClient实例已完成初始化,不为null。

内容的提问来源于stack exchange,提问作者rxversed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:36:02