You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
});
  • 排查基础错误
    • 确认表情ID881204535253676072确实属于你查询的目标服务器,跨服务器的表情如果你的Bot没有对应权限是无法获取的
    • 确认getEmotesByName方法的参数不要加前后冒号,只需要传表情的纯名称即可,加冒号会导致匹配失败
    • 确认你使用的JDA版本为最新稳定版,旧版本可能存在和Discord新API不兼容的问题

内容的提问来源于stack exchange,提问作者SteveB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:09:03