C# 有人知道我在试图处理一个反应时为什么会出现这个NullReferenceException错误吗

C# 有人知道我在试图处理一个反应时为什么会出现这个NullReferenceException错误吗,c#,discord.net,C#,Discord.net,所以我正在为我的Discord服务器创建一个Discord Bot,但我不明白为什么它不工作。我想问题出在我的ReactionHandler中,但我不确定是什么原因造成的 我试图修改一些代码。。但我无法理解,所以我想问别人是否知道我的代码有什么问题。。。我的代码可能很混乱,但我希望它不会介意你。我不会显示我的“命令”脚本,因为它与此问题无关 private async Task Client_CheckTicket(SocketMessage arg) { try {

所以我正在为我的Discord服务器创建一个Discord Bot,但我不明白为什么它不工作。我想问题出在我的ReactionHandler中,但我不确定是什么原因造成的

我试图修改一些代码。。但我无法理解,所以我想问别人是否知道我的代码有什么问题。。。我的代码可能很混乱,但我希望它不会介意你。我不会显示我的“命令”脚本,因为它与此问题无关

private async Task Client_CheckTicket(SocketMessage arg)
{
    try
    {
        var Message = arg as SocketUserMessage;
        var Context = new SocketCommandContext(Client, Message);
        if (Context.Channel.Id == debugchannel)
        {
            Console.WriteLine("Detected a debug message i wont be taking any actions against it");
            return;
        }

        if (Context.User.IsBot)
        {
            String s = "";
            String path = @"C:\Users\Alex\source\repos\discbot\ids.txt";

            using (StreamReader sr = File.OpenText(path))
            {
                try
                {
                    while ((s = sr.ReadLine()) != null)
                    {
                        await DebugMessage("Checking this message: " + Message.Content);
                        if (Context.Message.Content.Contains(s))
                        {
                            messageid = Message.Id;
                            await DebugMessage("added");
                        }

                    }

                }
                catch (Exception e)
                {
                    await DebugMessage("Something went wrong... Exception was sent to console!");
                    Console.WriteLine(e);
                    return;
                }
                sr.Close();

            }
            if (messageid != 0)
            {
                path = @"C:\Users\Alex\source\repos\discbot\messageid.txt";
                using (StreamWriter sr = File.AppendText(path))
                {
                    sr.WriteLine(messageid);
                    sr.Close();
                }
            }
            else
            {
                await DebugMessage("MessageID was 0 so i will not add it to my database");
                return;
            }

        }
        else
        {
            await DebugMessage("No pass");
        }
    } catch(Exception e)
    {
       await DebugMessage(e.ToString());
    }
}
全部代码:

从输出调试中获得的错误:

引发异常:discbot.dll中的“System.NullReferenceException”
引发异常:System.Private.CoreLib.dll中的“System.NullReferenceException”

在控制台上,我只得到:


26.6.2019 17.20.10在网关上,一个反应添加的处理程序引发了一个未处理的异常

我预计,当一个特定的反应被添加到“票据”中时,机器人会将消息发送到一个特定的频道

如果没有“Client.MessageReceived+=Client\u CheckTicket”和“Client.ReactionAdded+=OnReactionAdded”,则其他代码工作正常。但当我把它们加回去的时候,事情就停止了

注意:我没有在OnReactionAdded上获得DebugMessages,因此执行可能有问题吗

private async Task OnReactionAdded(Cacheable<IUserMessage, ulong> cache, ISocketMessageChannel channel, SocketReaction thereaction)
        {
            await DebugMessage("React func started");
我已尝试更多地定位问题,我认为问题就在这里:

 using (StreamReader sr = File.OpenText(path))
                    {
                        try
                        {
                            while ((s = sr.ReadLine()) != null)
                            {
                                DebugMessage("Checking this message: " + Message.Content);
                                if (Context.Message.Content.Contains(s))
                                {
                                    messageid = Message.Id;
                                    DebugMessage("added");
                                }

                            }

                        }
                        catch (Exception e)
                        {
                            DebugMessage("Something went wrong... Exception was sent to console!");
                            Console.WriteLine(e);
                            return;
                        }
                        sr.Close();

                    }
最后我得到了一些更具体的错误:

System.NullReferenceException:对象引用未设置为对象的实例。 在C:\Users\Alex\source\repos\discbot\discbot\Program.cs中的discbot.Program.DebugMessage(字符串a)处:第103行 在C:\Users\Alex\source\repos\discbot\discbot\Program.Client\u CheckTicket(SocketMessage arg)中的discbot.Program.Client\u处:第222行

第103行:
await Client.GetGuild(593114638770634763)、GetTextChannel(593430696874213384)、SendMessageAsync(a)

第222行:
等待调试消息(“无通过”)

是的,这是一个nullreference错误,有很多答案,但我无法理解

Console.WriteLine(a);
            await Client.GetGuild(593114638770634763).GetTextChannel(593430696874213384).SendMessageAsync(a);
WriteLine可以工作,但SenmessageAsync返回NullReferenceException。。我检查了我的服务器id和通道id是否正确

因此,问题在于:

public async Task DebugMessage(string a)
        {
            Console.WriteLine(a);
            await Client.GetGuild(593114638770634763).GetTextChannel(593430696874213384).SendMessageAsync(a);

        }
并且在上发生空错误:
Client.GetGuild(593114638770634763).GetTextChannel(593430696874213384).SendMessageAsync(a)

因为当我
等待DebugMessage(“No pass”)控制台.WriteLine可以工作,但是第二个不行?知道它为什么不起作用吗

字符串“a”不是原因,因为我将a变量替换为:
wait Client.GetGuild(593114638770634763)、GetTextChannel(593430696874213384)、SendMessageAsync(“确定”)

但它仍然不起作用

如果你仍然不明白哪一部分坏了,那就是:

await Client.GetGuild(593114638770634763).GetTextChannel(593430696874213384).SendMessageAsync(The variable is not causing this...);
现在我这样设置它:

public async Task DebugMessage(string a)
        {
            Console.WriteLine("Getting server");
            var server =  Client.GetGuild(593114638770634763);
            Console.WriteLine("Getting chat");
            var chat = server.GetTextChannel(593430696874213384);
            Console.WriteLine("Writing to Chat");
            await chat.SendMessageAsync(a);
            Console.WriteLine("Succeeded");

        }
它在以下方面失败了:
wait chat.SendMessageAsync(a)

“因为聊天是空的…很可能是因为您的ID不正确,并且在该公会中找不到具有匹配ID的频道。”-Anu6is 这起作用了……

“因为聊天是空的……很可能是因为你的ID不正确,并且在该公会中找不到具有匹配ID的频道。”-Anu6is
这起作用了……

哪一行引发此异常?这里有很多地方可以抛出NullReferenceException。在使用A.B.C之前,您需要首先确保A.B不为null,最好每次都检查并放置调试消息,或者使用null条件运算符,如A?.B?.C。此外,当您需要强制转换某些内容时,请使用(SocketUserMessage)参数,该参数将在失败时抛出InvalidCastException。在不检查null的情况下使用“as”会让代码稍后失败,但不清楚网关上的强制转换是否失败26.6.2019 17.20.10反应添加的处理程序引发了未处理的异常。这就是我在控制台日志中看到的错误。为什么不分解语句,使用调试器尝试找出null值,而不是将调用链接在一起?一旦您知道哪个变量为null,可能有人会提供帮助,解释为什么它可能为null。但您首先需要明确指出什么是null。这是导致错误的行,或者我认为:
wait Client.GetGuild(593114638770634763)、GetTextChannel(593430696874213384)、SendMessageAsync(a)
public async Task DebugMessage(string a){Console.WriteLine(a);wait Client.GetGuild(593114638770634763)。GetTextChannel(593430696874213384)。SendMessageAsync(a);}
@anu6i现在是否更具体了…哪一行引发此异常?这里有很多地方可以抛出NullReferenceException。在使用A.B.C之前,您需要首先确保A.B不为null,最好每次都检查并放置调试消息,或者使用null条件运算符,如A?.B?.C。此外,当您需要强制转换某些内容时,请使用(SocketUserMessage)参数,该参数将在失败时抛出InvalidCastException。在不检查null的情况下使用“as”会让代码稍后失败,但不清楚网关上的强制转换是否失败26.6.2019 17.20.10反应添加的处理程序引发了未处理的异常。这就是我在控制台日志中看到的错误。为什么不分解语句,使用调试器尝试找出null值,而不是将调用链接在一起?一旦您知道哪个变量为null,可能有人会提供帮助,解释为什么它可能为null。但您首先需要明确指出什么是null。这是导致错误的行,或者我认为:
wait Client.GetGuild(593114638770634763)、GetTextChannel(593430696874213384)、SendMessageAsync(a)public async Task DebugMessage(字符串a){Console.WriteLine(a);wait Client.GetGuild(593114638770634763).GetTextChannel(593430696874213384).SendMessageA
public async Task DebugMessage(string a)
        {
            Console.WriteLine("Getting server");
            var server =  Client.GetGuild(593114638770634763);
            Console.WriteLine("Getting chat");
            var chat = server.GetTextChannel(593430696874213384);
            Console.WriteLine("Writing to Chat");
            await chat.SendMessageAsync(a);
            Console.WriteLine("Succeeded");

        }