JDA获取Emote的相关API始终返回null或空列表该如何解决?
问题解决思路
- 首先确认 Discord 开发者后台的 Bot 配置页已经开启
GUILD_EMOJIS_AND_STICKERS意图,同时在初始化JDABuilder时显式启用该意图:
JDA jda = JDABuilder.createDefault(token) .enableIntents(GatewayIntent.GUILD_EMOJIS_AND_STICKERS) .enableCache(CacheFlag.EMOTE) .build();
该配置是最常见的遗漏点,没有开启对应意图的话,JDA不会接收服务器表情数据,本地缓存自然为空,导致所有缓存查询接口返回null。
- 不要依赖本地缓存查询,改用主动拉取的RestAPI接口
如果缓存机制始终异常,可以直接调用JDA提供的主动拉取接口,跳过本地缓存直接向Discord服务端请求表情数据:
Guild guild = jda.getGuildById(MyGuildId); // 异步拉取单个指定ID的表情 guild.retrieveEmoteById(881204535253676072L).queue(emote -> { // 这里拿到的emote就是正确的表情对象 System.out.println("获取到表情:" + emote.getName()); }, failure -> { // 拉取失败时可以在这里打印错误信息排查原因,比如ID错误、权限不足 failure.printStackTrace(); }); // 如果需要拉取当前服务器全部表情再筛选 guild.retrieveEmotes().queue(emotes -> { // 这里的emotes是当前服务器全部表情列表,可以自行按名称/ID筛选 Emote football = emotes.stream() .filter(e -> e.getIdLong() == 881204535253676072L) .findFirst() .orElse(null); });
- 排查基础错误
- 确认表情ID
881204535253676072确实属于你查询的目标服务器,跨服务器的表情如果你的Bot没有对应权限是无法获取的 - 确认
getEmotesByName方法的参数不要加前后冒号,只需要传表情的纯名称即可,加冒号会导致匹配失败 - 确认你使用的JDA版本为最新稳定版,旧版本可能存在和Discord新API不兼容的问题
- 确认表情ID
内容的提问来源于stack exchange,提问作者SteveB
相关产品推荐
相关产品推荐

