JDA 4.4.0_352中createGuild()回调内getSystemChannel()失效求助
问题原因
创建服务器后,JDA返回的Guild对象仅包含基础初始化信息,系统频道的缓存尚未同步到本地,直接调用getSystemChannel()会返回null,导致后续代码无法执行。
解决方案
改用guild.loadSystemChannel()异步加载系统频道数据,待频道信息获取完成后再创建邀请链接。修改后的代码如下:
if (message[0].equalsIgnoreCase("!makeserver")) { if (message.length < 2) { event.getChannel().sendMessage("Name the server!").queue(); return; } String serverName = message[1]; event.getJDA().createGuild(serverName).queue(guild -> { // 异步加载系统频道的完整信息 guild.loadSystemChannel().queue(defaultChannel -> { defaultChannel.createInvite().queue(invite -> { String inviteUrl = invite.getUrl(); event.getChannel().sendMessage("I made the server and send the link!\n" + inviteUrl).queue(); }, error -> { event.getChannel().sendMessage("Fail to send link.").queue(); if (error instanceof Exception) { ((Exception) error).printStackTrace(); } }); }, error -> { event.getChannel().sendMessage("Failed to load system channel.").queue(); if (error instanceof Exception) { ((Exception) error).printStackTrace(); } }); }, error -> { event.getChannel().sendMessage("Fail to make the server.").queue(); if (error instanceof Exception) { ((Exception) error).printStackTrace(); } }); }
补充说明
loadSystemChannel()会主动调用Discord API拉取系统频道的最新数据,确保能获取到有效的频道对象,替代直接读取本地缓存的getSystemChannel()。- 如果不需要严格指定系统频道,也可以使用
guild.getTextChannels().get(0)获取服务器创建的第一个文本频道,但这种方式可靠性不如加载系统频道。
内容的提问来源于stack exchange,提问作者Dsyt
相关产品推荐
相关产品推荐

