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