我正在使用 Java 和 JDA API 开发不和谐的机器人。在此之前,我问了类似的问题,但遇到另一个问题。
从这一行开始出现问题:
final Member MentionedMem = event.getMessage().getMentionedMembers().get(0);
感谢 https://stackoverflow.com/users/10630900/minn 回答了上一个问题,在该问题中他向我解释了这一行正在引起错误:
java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
由于某种原因,它会引发错误。
我正在尝试找到此命令为何不起作用的答案。我唯一知道的是该命令returns
是一个空数组args
。因此,我无法完成机器人程序,也就是无法检查成员是否可以踢别人,也不能成为代码踢成员的主要组成部分。
如何解决此错误和/或编写其余代码? 对不起,我的英文,谢谢你。
某些代码:
public class KickComm extends ListenerAdapter {
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
String[] message = event
.getMessage()
.getContentRaw()
.split(" ");
// final Member target = event.getMessage().getMentionedMembers().get(0); ERROR CUZ I DONT NOW WHY
final Member SelfMember = event
.getGuild()
.getSelfMember();
if(message[0].equalsIgnoreCase(Main.prefix + "kick"))
{
if (message.length < 2) {
EmbedBuilder NoUser = new EmbedBuilder();
NoUser.setColor(0xff3923);
NoUser.setTitle("\uD83D\uDD34You need to add a <@username> and <reason>");
NoUser.setFooter("Usage: " + Main.prefix + "kick <@username> <reason>.",
Objects
.requireNonNull(event.getMember())
.getUser()
.getAvatarUrl());
event
.getChannel()
.sendMessage(NoUser.build())
.queue();
NoUser.clear();
} else if (message.length < 3) {
EmbedBuilder NoReason = new EmbedBuilder();
NoReason.setColor(0xff3923);
NoReason.setTitle("\uD83D\uDD34You need to add a <reason>.");
NoReason.setFooter("Usage: " + Main.prefix + "kick <@username> <reason>.",
Objects
.requireNonNull(event.getMember())
.getUser()
.getAvatarUrl());
event
.getChannel()
.sendMessage(NoReason.build())
.queue();
NoReason.clear();
} else if(!SelfMember.hasPermission(Permission.KICK_MEMBERS)) {
EmbedBuilder NoPermission = new EmbedBuilder();
NoPermission.setColor(0xff3923);
NoPermission.setTitle("\uD83D\uDD34You don't have permission to use this command.");
NoPermission.setFooter("Usage: " + Main.prefix + "kick <@username> <reason>.",
Objects
.requireNonNull(event.getMember())
.getUser()
.getAvatarUrl());
event
.getChannel()
.sendMessage(NoPermission.build())
.queue();
NoPermission.clear();
} else if(!Objects.requireNonNull(event.getMember()).hasPermission(Permission.KICK_MEMBERS) || !event.getMember().canInteract(target)) { //Example, don't works
EmbedBuilder NoPermission = new EmbedBuilder();
NoPermission.setColor(0xff3923);
NoPermission.setTitle("\uD83D\uDD34You don't have permission to use this command.");
NoPermission.setFooter("Usage: " + Main.prefix + "kick <@username> <reason>.",
Objects
.requireNonNull(event.getMember())
.getUser()
.getAvatarUrl());
event
.getChannel()
.sendMessage(NoPermission.build())
.queue();
NoPermission.clear();
}
}
}
}
UPD:请降级,然后指出我的错误,而不仅仅是因为您想降级。我想纠正错误,而不是破坏心情
答案 0 :(得分:0)
似乎您没有在代码中完全解决问题。
final Member target = event.getMessage().getMentionedMembers().get(0);
如果您的邮件中不包含提及的成员,则会抛出IndexOutOfBoundsException
。因为在这种情况下,getMentionedMembers()
的列表为空。没有对象可访问。 get(0)
什么也得不到。
要解决此问题,必须首先检查列表是否为空或长度是否为0(如Minn所建议的)。如果是,则可以显示一条消息,说明他们需要添加@username。
清理代码并进行相应的重组将对我有很大帮助。请仔细检查并确保始终检查所需的数据是否存在,以及您是否真的需要它。有些事情仅在少数情况下才需要,因此在每条消息/命令上都调用它们不是一个好习惯。
例如,当前您的机器人试图从发送的每条消息中获取第一个提到的成员。这不是必需的,因此仅在它是kick命令的情况下才需要。
顺便说一下,SelfMember
是机器人本身。在您的代码中,您告诉用户他们没有权限,尽管该漫游器(不一定是用户)可能缺少权限,这可能会造成混淆。
我之前没有看到:您的机器人也收到了自己的消息。在继续之前,您可能需要检查消息的作者是否是您的机器人。
最后,我建议您始终尝试理解给出的答案或建议。向另一个问题提出相同的问题不会帮助您,也不会为您和您的学习尝试锦上添花。