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
相关产品推荐
相关产品推荐

