0

Всех приветствую. Не смог найти адекватного гайда по обработке нажатия кнопок в телеграм бот на Джава. Пришлось по чуть чуть воровать кусочки кода из разных источников. Туда-сюда,получился вот такой вот код , но ответа на коллБэк нет.Ошибка в консоли:NullPointerException. Помогите понять что не так ,в чем суть обработки колБэков,и если можно,статьи на эту тему,ибо в интернете развёрнутого пояснения не нашел.Код класса Бот ниже

public class Bot extends TelegramLongPollingBot{

@Override public String getBotUsername() { return "asdzxc_bot"; }

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

@Override public void onUpdateReceived(Update update) { String message = update.getMessage().getText(); if(update.hasMessage()){ if(update.getMessage().hasText()){ if(update.getMessage().getText().equals("Hello")){ try { execute(sendInlineKeyBoardMessage(update.getMessage().getChatId())); } catch (TelegramApiException e) { e.printStackTrace(); } } } }else if (update.hasCallbackQuery()) { // Set variables String call_data = update.getCallbackQuery().getData(); long message_id = update.getCallbackQuery().getMessage().getMessageId(); long chat_id = update.getCallbackQuery().getMessage().getChatId();

 if (call_data.equals("1")) {
     String answer = "ОтработалКоллБэк";
     EditMessageText new_message = new EditMessageText()
             .setChatId(chat_id)
             .setMessageId(toIntExact(message_id))
             .setText(answer);
     try {
         execute(new_message); 

     } catch (TelegramApiException e) {
         e.printStackTrace();
     }
 }

}

switch(message) {

case("демики"): sendMsgDemiki(update.getMessage().getChatId().toString(), message); break; case("Демики"): sendMsgDemiki(update.getMessage().getChatId().toString(), message); break; case("24г"): sendMsgDemiki(update.getMessage().getChatId().toString(), message); break; case("владики"): sendMsgVladiki(update.getMessage().getChatId().toString(), message); break; case("Владики"): sendMsgVladiki(update.getMessage().getChatId().toString(), message); break; /* case("Inf"): sendMsgInf(update.getMessage().getChatId().toString(), message); break; case("inf"): sendMsgInf(update.getMessage().getChatId().toString(), message); break; */

} }

private Integer toIntExact(long message_id) { return (int) message_id; } /**

  • Метод для настройки сообщения и его отправки.
  • @param chatId id чата
  • @param s Строка, которую необходимот отправить в качестве сообщения.

*/

public synchronized void sendMsgDemiki(String chatId, String s) { SendMessage sendMessage = new SendMessage(); sendMessage.enableMarkdown(true); sendMessage.setChatId(chatId); sendMessage.setText("Демидионы ,вас зовут! @Plumpla @NastasiaMolotkova"); try { sendMessage(sendMessage); } catch (TelegramApiException e) { e.printStackTrace(); }

}

public synchronized void sendMsgVladiki(String chatId, String s) { SendMessage sendMessage = new SendMessage(); sendMessage.enableMarkdown(true); sendMessage.setChatId(chatId); sendMessage.setText("AGHTUNGH @ZhekaRoyzman @TolyaOdessit"); try { sendMessage(sendMessage); } catch (TelegramApiException e) { e.printStackTrace(); }

}

public static SendMessage sendInlineKeyBoardMessage(long chatId) { InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); InlineKeyboardButton inlineKeyboardButton1 = new InlineKeyboardButton(); InlineKeyboardButton inlineKeyboardButton2 = new InlineKeyboardButton(); inlineKeyboardButton1.setText("Тыk"); inlineKeyboardButton1.setCallbackData("1"); inlineKeyboardButton2.setText("Тык2"); inlineKeyboardButton2.setCallbackData("Button &quot;Тык2&quot; has been pressed"); List<InlineKeyboardButton> keyboardButtonsRow1 = new ArrayList<>(); List<InlineKeyboardButton> keyboardButtonsRow2 = new ArrayList<>(); keyboardButtonsRow1.add(inlineKeyboardButton1); keyboardButtonsRow1.add(new InlineKeyboardButton().setText("Fi4a").setCallbackData("CallFi4a")); keyboardButtonsRow2.add(inlineKeyboardButton2); List<List<InlineKeyboardButton>> rowList = new ArrayList<>(); rowList.add(keyboardButtonsRow1); rowList.add(keyboardButtonsRow2); inlineKeyboardMarkup.setKeyboard(rowList); return new SendMessage().setChatId(chatId).setText("Пример").setReplyMarkup(inlineKeyboardMarkup); }

}

В консоли следующая ошибка :

янв. 28, 2021 1:20:06 PM org.telegram.telegrambots.logging.BotLogger severe
SEVERE: BOTSESSION
java.lang.NullPointerException
    at bot.SBKbot.Bot.onUpdateReceived(Bot.java:35)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    at org.telegram.telegrambots.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27)
    at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:306)

Как правильно обрабатывать каллБэк?В чём суть этого процеса,что у меня не правильно.и если кто то знает хорошие статьи на эту тему,буду очень благодарен за содействие.Спасибо зарание!

  • весьма любопытная методика: первой строкой метода onUpdateReceived уверенно обращаться к update.getMessage().getText(), а потом начинать сомневаться - "а был ли мальчик" (if(update.hasMessage()) – kami Jan 28 '21 at 11:40
  • @kami по кусочкам собирал,говорю же) –  Jan 29 '21 at 12:15
  • @АлексейШиманский что такое нулл я знаю,вопрос в причине его возникновения –  Jan 29 '21 at 12:16
  • Там написано: "Это Exception , который встречается тогда, когда ты ссылаешься на объект, который = null(не инициализирован) или пытаешься вызвать методы/обратиться к переменным объекта, который = null." – Алексей Шиманский Jan 29 '21 at 12:35
  • @ЕвгенийОлегович я вам в ироничной форме озвучил самого вероятного кандидата на роль runtime-ошибки. Воспринимать это как руководство к действию или нет - ваше право. Можно и полностью самому начать разбираться - поставить breakpoint на первую строчку метода и пойти пошагово. Кстати, в Wiki этого бота значительно более правильная обработка OnUpdateReceived - https://github.com/rubenlagus/TelegramBots/wiki/Getting-Started – kami Jan 30 '21 at 10:07

1 Answers1

0

если 35 строка это

String message = update.getMessage().getText();

то, возможно, в сообщении, которое гетапдейт обрабатывает нет текста.

Dmitry
  • 7,859
MR.Kay
  • 1
  • В текущем виде ваш ответ непонятен. Пожалуйста, нажмите [edit] под сообщением, чтобы добавить больше подробностей, которые помогут другим понять, как он отвечает на заданный вопрос. Вы можете найти больше информации о том, как писать хорошие ответы в Справке. – Дух сообщества Feb 22 '22 at 12:36