Есть два класса: 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)
Возможно проблема в строке
rev.substring(rev.indexOf(" "))
Подозреваю, что indexOf возвращает вам -1, что говорит о том, что нет такого символа в строке. Потом пытаемся взять substring, начиная с индекса -1, по которому не возможно обратиться ни к одному элементу строки, т.к. индекс находится за пределами массива символов строки. Надеюсь доступно объяснил.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Если из разных потоков в HashMap добавляются (только добавляются и не более того) записи, то необходимо ли при этом синхронизировать вызов метода...
При запускеjar файла возникает следующая ошибка:
Всем приветРешил сделать простенькое приложение для "изучения" английского