Почему телегреам-бота крашит, но если убрать проблемную строку, то возникает ошибка "Cannot resolve symbol"?

Рейтинг: -3Ответов: 1Опубликовано: 12.05.2023

Пишу простенького телеграм бота. У меня есть метод:

public String waitUserInput() {
        TelegramBot bot = new TelegramBot();
        String userInput = "";
        int lastUpdateId = 0; // переменная для хранения идентификатора последнего обновления

        while (true) {
            List<Update> updates = new ArrayList<>();
            try {
                GetUpdates getUpdates = new GetUpdates();
                getUpdates.setOffset(lastUpdateId + 1);
                updates = bot.execute(getUpdates);
            } catch (TelegramApiException e) {
                e.printStackTrace();
            }

            for (Update update : updates) {
                if (update.hasMessage() && update.getMessage().hasText()) {
                    userInput = update.getMessage().getText();
                    lastUpdateId = update.getUpdateId(); // обновляем значение идентификатора последнего обновления
                }
            }

            if (!userInput.isEmpty()) {
                break;
            }

            try {
                Thread.sleep(1000); // ждем 1 секунду перед повторной проверкой наличия новых сообщений
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        return userInput;
    }

Когда запускаю бота при вызове данного метода, его крашит. Судя по логам и тому что я нагуглил это происходит из-за "Вызова второго экземпляра бота". Как я понимаю проблема в строке:

TelegramBot bot = new TelegramBot;

Но если убрать её возникает ошибка:

Cannot resolve symbol bot

В строке

updates = bot.execute(getUpdates);

Как я понимаю, оно не распознает инициализированного бота. Хотя он есть в классе Main:

public class Main {
    public static void main(String[] args) throws TelegramApiException {
        TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class);
        try {
            TelegramBot bot = new TelegramBot();
            botsApi.registerBot(bot);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }

    }
}

Хотелось бы узнать, как можно исправить данную ошибку. Заранее спасибо!

Ответы

▲ 0

Если в программе может быть только один экземпляр бота, следует использовать синглтон, например как показано в ответе на вопрос: Как переделать класс в синглтон?:

// синглтон с ленивой инициализацией
public class TelegramBot {
    private static class BotProvider {
        private static final TelegramBot INSTANCE = new TelegramBot();
    }

    public static TelegramBot getInstance() {
        return BotProvider.INSTANCE;
    }

    // приватный конструктор
    private TelegramBot() {}
}

Соответственно, вызов конструктора new TelegramBot() следует заменить на вызов метода TelegramBot.getInstance():

  • в классе Main
public class Main {
    public static void main(String[] args) throws TelegramApiException {
        TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class);
        try {
            TelegramBot bot = TelegramBot.getInstance();
            botsApi.registerBot(bot);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
}
  • в методе waitUserInput()
public String waitUserInput() {
    TelegramBot bot = TelegramBot.getInstance();
    // ...
}

Аналогично, при реализации синглтона с помощью идиоматического преобразования класса в перечисление enum:

public enum TelegramBot {
    INSTANCE;

    // остальной код бота
}

все обращения к боту выполняются как к обычному экземпляру перечисления: TelegramBot bot = TelegramBot.INSTANCE;