JDA提到的成员-无法正常运行

时间:2020-08-02 13:49:55

标签: java discord discord-jda

我正在使用 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:请降级,然后指出我的错误,而不仅仅是因为您想降级。我想纠正错误,而不是破坏心情

1 个答案:

答案 0 :(得分:0)

似乎您没有在代码中完全解决问题。

final Member target = event.getMessage().getMentionedMembers().get(0);

如果您的邮件中不包含提及的成员,则会抛出IndexOutOfBoundsException。因为在这种情况下,getMentionedMembers()的列表为空。没有对象可访问。 get(0)什么也得不到。

要解决此问题,必须首先检查列表是否为空或长度是否为0(如Minn所建议的)。如果是,则可以显示一条消息,说明他们需要添加@username。

清理代码并进行相应的重组将对我有很大帮助。请仔细检查并确保始终检查所需的数据是否存在,以及您是否真的需要它。有些事情仅在少数情况下才需要,因此在每条消息/命令上都调用它们不是一个好习惯。

例如,当前您的机器人试图从发送的每条消息中获取第一个提到的成员。这不是必需的,因此仅在它是kick命令的情况下才需要。

顺便说一下,SelfMember是机器人本身。在您的代码中,您告诉用户他们没有权限,尽管该漫游器(不一定是用户)可能缺少权限,这可能会造成混淆。

我之前没有看到:您的机器人也收到了自己的消息。在继续之前,您可能需要检查消息的作者是否是您的机器人。

最后,我建议您始终尝试理解给出的答案或建议。向另一个问题提出相同的问题不会帮助您,也不会为您和您的学习尝试锦上添花。