Почему выдаёт ошибку StringIndexOutOfBoundsException: String index out of range

131
09 декабря 2020, 18:10

Есть два класса: Bot и Parser. До недавнего времени бот парсил весь текст как надо, но после добавления класса TheGame появилась эта ошибка. Не понимаю как я смог выйти за длину строки?

public class Bot extends TelegramLongPollingBot {
private String botName = "@ParseSteamBot";
private String token = "";
public static List<TheGame> gameList = new ArrayList<>();
private long chatId;
Document document;
DBconnect dbConnect = new DBconnect();
Parser parser = new Parser();
public void onUpdateReceived(Update update) {
    update.getUpdateId();
    chatId = update.getMessage().getChatId();
    Message msg = update.getMessage();
    if (msg != null && msg.hasText()) {
        //if(msg.getText().equals("/start")) {
        InlineKeyboardMarkup keyboardMarkup = new InlineKeyboardMarkup();
        List<List<InlineKeyboardButton>> listOfButtons = new ArrayList<>();
        List<InlineKeyboardButton> keyboardButtonsRow = new ArrayList<>();
        keyboardButtonsRow.add(new InlineKeyboardButton().setText("Save to DB").setCallbackData("/save"));
        listOfButtons.add(keyboardButtonsRow);
        keyboardMarkup.setKeyboard(listOfButtons);
        SendMessage sendMessage = new SendMessage().setChatId(chatId);
        try {
            sendMessage.setText(parser.ParseText(msg.getText())).setReplyMarkup(keyboardMarkup);
            execute(sendMessage);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
        SendPhoto sendPhoto = new SendPhoto().setChatId(chatId);
        try {
            sendPhoto.setPhoto(parser.ParseImg(msg.getText()));
            execute(sendPhoto);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
    else if(update.hasCallbackQuery()) {
        String call_data = update.getCallbackQuery().getData();
        long message_id = update.getCallbackQuery().getMessage().getMessageId();
        chatId = update.getCallbackQuery().getMessage().getChatId();
        EditMessageText editMessageText = new EditMessageText().setChatId(chatId);
        int i = 0;
        if(call_data.equals("/save")){
            try {
                dbConnect.saveToDb(gameList.get(i));
                editMessageText.setText("Игра " + gameList.get(i).getName() + " сохранена в базу данных");
                i++;
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

public String getBotUsername() {
    return botName;
}
@Override
public String getBotToken() {
    return token;
}

}

Класс Parser:

public class Parser {
Document document;
public String ParseText(String href) {
    String info = null;
    try {
        document = Jsoup.connect(href).get();
        Elements name = document.getElementsByClass("apphub_AppName");
        Elements price = document.getElementsByClass("game_purchase_price price");
        Elements description = document.getElementsByClass("game_description_snippet");
        Elements reviews = document.getElementsByClass("responsive_hidden");
        Elements developers = document.getElementsByAttributeValue("id", "developers_list");
        Elements tags = document.getElementsByClass("glance_tags popular_tags");
        String rev = reviews.text().replaceAll("[()]", "");
        info = "Название: " + name.text() + "\n\n"
                + "Цена: " + price.text() + "\n\n"
                + "Описание: " + description.text() + "\n\n"
                + "Отзывы: " + rev.substring(rev.indexOf(" ")) + "\n\n"
                + "Разработчики: " + developers.text() + "\n\n"
                + "Метки: " + tags.text().replaceAll("[+]", "");
        TheGame game = new TheGame(name.text(),
                                    Integer.parseInt(price.text().substring(price.indexOf(" "))),
                                    description.text(),
                                    Integer.parseInt(rev.substring(rev.indexOf(" "))),
                                    developers.text(),
                                    tags.text().replaceAll("[+]", ""));
        Bot.gameList.add(game);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return info;
}
public File ParseImg(String href) {
    File file;
    try {
        document = Jsoup.connect(href).get();
        Elements img = document.getElementsByClass("game_header_image_full");
        try(InputStream in = new URL(img.attr("src")).openStream()){
            if(Files.exists(Paths.get("C:/images/image.jsp"))){
                Files.delete(Paths.get("C:/images/image.jsp"));
            }
            Files.copy(in, Paths.get("C:/images/image.jsp"));
            return new File("C:/images/image.jsp");
        }
        catch(IOException e){
            e.printStackTrace();
        }
    } catch(IOException e){
        System.out.println("Image not found...");
        e.printStackTrace();
    }
    return null;
}

}

А вот полный текст с ошибками:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1927)
at Parser.ParseText(Parser.java:44)
at Bot.onUpdateReceived(Bot.java:46)
at java.util.ArrayList.forEach(ArrayList.java:1249)
at org.telegram.telegrambots.meta.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27)
at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:306)
Answer 1

Возможно проблема в строке

rev.substring(rev.indexOf(" "))

Подозреваю, что indexOf возвращает вам -1, что говорит о том, что нет такого символа в строке. Потом пытаемся взять substring, начиная с индекса -1, по которому не возможно обратиться ни к одному элементу строки, т.к. индекс находится за пределами массива символов строки. Надеюсь доступно объяснил.

READ ALSO
Синхронизация Map

Синхронизация Map

Если из разных потоков в HashMap добавляются (только добавляются и не более того) записи, то необходимо ли при этом синхронизировать вызов метода...

152
A JNI error has occured, please check your installation and try again

A JNI error has occured, please check your installation and try again

При запускеjar файла возникает следующая ошибка:

272
Проблема с button JAVA (android Studio)

Проблема с button JAVA (android Studio)

Всем приветРешил сделать простенькое приложение для "изучения" английского

132