java StringIndexOutOfBoundsException: -1 - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь написать дискорд-бот. Теперь у меня есть следующая проблема: сначала я загружаю префикс с помощью String prefix = Setttings.readSetting ("Prefix"); Затем я проверяю, начинается ли сообщение, полученное с диска, с префикса. Если этот тест пройден, я обрезаю Сообщение, извлекаю саму команду и выполняю метод в классе метода. Но вот моя проблема: когда мой префикс длиннее 1 символа, я получаю StringIndexOutOfBoundsException.

java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at listener.CommandManager.onGuildMessageReceived(CommandManager.java:38)
    at net.dv8tion.jda.api.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:395)
    at net.dv8tion.jda.api.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:96)
    at net.dv8tion.jda.internal.hooks.EventManagerProxy.handle(EventManagerProxy.java:64)
    at net.dv8tion.jda.internal.JDAImpl.handleEvent(JDAImpl.java:165)
    at net.dv8tion.jda.internal.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:97)
    at net.dv8tion.jda.internal.handle.SocketHandler.handle(SocketHandler.java:36)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onDispatch(WebSocketClient.java:881)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onEvent(WebSocketClient.java:769)
    at net.dv8tion.jda.internal.requests.WebSocketClient.handleEvent(WebSocketClient.java:748)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onBinaryMessage(WebSocketClient.java:919)
    at com.neovisionaries.ws.client.ListenerManager.callOnBinaryMessage(ListenerManager.java:385)
    at com.neovisionaries.ws.client.ReadingThread.callOnBinaryMessage(ReadingThread.java:276)
    at com.neovisionaries.ws.client.ReadingThread.handleBinaryFrame(ReadingThread.java:996)
    at com.neovisionaries.ws.client.ReadingThread.handleFrame(ReadingThread.java:755)
    at com.neovisionaries.ws.client.ReadingThread.main(ReadingThread.java:108)
    at com.neovisionaries.ws.client.ReadingThread.runMain(ReadingThread.java:64)
    at com.neovisionaries.ws.client.WebSocketThread.run(WebSocketThread.java:45)

Вот код класса:

package listener;

import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import tools.Settings;

import java.util.HashMap;
import java.util.Map;

import commands.*;

import assets.Command;

public class CommandManager extends ListenerAdapter {

    private static Map<String, Command> commands = new HashMap<String, Command>(); //here's where i store all the commands

    public static void init() { //In this method i put all the commands in the ArrayList. I call it on Program Start.

        commands.put("test", new TestCommand());

    }

    @Override
    public void onGuildMessageReceived(GuildMessageReceivedEvent event) {

        String prefix = Settings.readSetting("Prefix"); //Here i load the prefix.

        if(event.getMessage().getContentDisplay().startsWith(prefix)) {

            try {

                Command c = commands.get(event.getMessage().getContentDisplay().split(" ")[0].substring(prefix.length())); //Here occurs the error.

                if(c != null) {

                    c.execute(event);

                } else {

                    event.getChannel().sendMessage("Sorry, that command doesn't exist").queue();

                }

            } catch(Exception e) {

                e.printStackTrace();

            }
        }
    }

}

Кто-нибудь знает ошибку и / или как это исправить? Спасибо.

1 Ответ

0 голосов
/ 04 мая 2020

Во-первых, о конкретном c исключении: https://www.geeksforgeeks.org/understanding-array-indexoutofbounds-exception-in-java/

Обычно выдается IndexOutOfBoundsException, если к массиву (или String) обращаются таким образом Таким образом, индекс аргумента находится за пределами диапазона индекса массива.

В вашем случае выдается исключение, потому что выполняемое вами разбиение строки, вероятно, не возвращает значение в массиве с индексом 0, которое является таким длинным как prefix.length(). Или другими словами: что произойдет, если сообщение, возвращаемое getMessage, будет меньше длины вашего префикса?

Практический пример:

// assume this input:
String prefix = "Hello";
String messageContentDisplay = "Hello Jack";

// your code does:
String[] segments = messageContentDisplay.split(" ");
String prefixInMessage = segments[0];
String subMessage = prefixInMessage.substring(prefix.length()); // This makes no sense.

Я верю в то, что вы на самом деле хотите это вырезать префикс, который будет работать так:

String displayContent = event.getMessage().getContentDisplay();
String[] segments = displayContent.split(" ");
if (segments.length > 1) {
    Command c = commands.get(displayContent.substring(segments[0].length));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...