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

Discord机器人EmbedBuilder创建嵌入消息报错及方法废弃问题求助

修复方案

1. 解决java.lang.IndexOutOfBoundsException异常

异常触发的核心原因是你把读取提及用户的逻辑放在了方法最开头,所有服务器消息触发事件时都会执行getMentionedMembers().get(0)和getMentionedUsers().get(0)。当用户发送!commands命令时没有@任何用户,提及成员/用户列表为空,直接取索引0自然抛出越界错误。
修复逻辑:

  • 将获取member、user的代码移动到需要@用户的!hauste、!spam命令分支内部
  • 增加提及用户存在性校验,无提及用户时直接返回提示,避免取空列表的索引

2. 解决sendMessage方法废弃问题

JDA 4及以上版本中,直接传入Embed对象的sendMessage方法已被废弃,官方新增了专门的嵌入消息发送方法,直接替换调用API即可。


修复后完整代码

public class Commands extends ListenerAdapter {

    public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
        // 过滤机器人自己发的消息,避免循环触发
        if (event.getAuthor().isBot()) {
            return;
        }

        String[] args = event.getMessage().getContentRaw().split("\\s+");

        // 踢人命令
        if (args[0].equalsIgnoreCase(Main.prefix + "hauste")) {
            // 校验参数和提及用户
            if (event.getMessage().getMentionedMembers().isEmpty() || args.length < 2) {
                event.getChannel().sendMessage("命令格式错误,正确格式:!hauste @用户 备注内容").queue();
                return;
            }
            Member member = event.getMessage().getMentionedMembers().get(0);
            User user = event.getMessage().getMentionedUsers().get(0);

            event.getChannel().sendMessage("Hauste rein " + args[1]).queue();
            sendMess(user, "Wurdest halt gekickt ");
            member.kick("Bye").queue();
        } 
        // spam命令
        else if (args[0].equalsIgnoreCase(Main.prefix + "spam")) {
            // 校验参数和提及用户
            if (event.getMessage().getMentionedMembers().isEmpty() || args.length < 4) {
                event.getChannel().sendMessage("命令格式错误,正确格式:!spam @用户 发送次数 发送内容").queue();
                return;
            }
            User user = event.getMessage().getMentionedUsers().get(0);
            int count;
            try {
                count = Integer.parseInt(args[2]);
                // 限制发送次数,避免刷屏被风控
                if (count <= 0 || count > 10) {
                    event.getChannel().sendMessage("发送次数需在1-10之间").queue();
                    return;
                }
            } catch (NumberFormatException e) {
                event.getChannel().sendMessage("发送次数必须为有效数字").queue();
                return;
            }
            for (int i = 0; i < count; i++) {
                sendMess(user, args[3]);
            }
        } 
        // 指令列表命令
        else if (args[0].equalsIgnoreCase(Main.prefix + "commands")) {
            EmbedBuilder commands = new EmbedBuilder();
            commands.setTitle("Alle Commands", null);
            commands.setDescription(
                    "1. Kick :   !kick @user\n" + "2. Spam :   !spam @user {Anzahl der Nachrichten} {Nachricht}");
            commands.setColor(Color.red);
            // 使用新的嵌入消息发送API替换废弃方法
            event.getChannel().sendMessageEmbeds(commands.build()).queue();
        }

    }

    /**
     * Extra Methode um dem User eine Nachricht zu schicken
     * 
     * @param user Der angegebene User
     * @param text Der gewünschte Text
     */
    public void sendMess(User user, String text) {
        user.openPrivateChannel().queue((channel) -> {
            channel.sendMessage(text).queue();
        });
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:30:01