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,也会触发同类报错。
修复方案
- 修正
Init方法的赋值逻辑,将传入的客户端实例正确赋值给类属性:
public async Task Init(DiscordSocketClient client) { // 修复赋值错误,将入参client赋值给类属性 this.Client = client; Commands = new CommandService(); await Commands.AddModulesAsync(Assembly.GetEntryAssembly(), null); Client.MessageReceived += HandleCommand; }
- 修正命令执行的异步调用逻辑,添加
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}"); } }
- 调用
Init方法前,确保传入的DiscordSocketClient实例已完成初始化,不为null。
内容的提问来源于stack exchange,提问作者rxversed
相关产品推荐
相关产品推荐

