powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Странный NPE то появляется, то исчезает
8 сообщений из 8, страница 1 из 1
Странный NPE то появляется, то исчезает
    #39944669
Wasteland Rebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, написал я парсер для Google Play и встроил его в телеграм бота. Всё получилось, работает как надо. Но встретил необъяснимую загадку: когда я пытаюсь получить информацию об играх одного разработчика, то вылетает NPE. Попробую описать логику с прикреплением кода.

Есть класс, который представляет собой объект игры:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
@Builder(builderClassName = "GooglePlayGameBuilder", toBuilder = true)
@JsonDeserialize(builder = GooglePlayGame.GooglePlayGameBuilder.class)
@Getter
@EqualsAndHashCode(exclude = { "genre", "devEmail" })

public final class GooglePlayGame  {

    @JsonProperty("Название игры") private final String title;

    @JsonProperty("Категория") private final String genre;

    @JsonProperty("Стоимость игры") private final String price;

    @JsonProperty("Дата последнего обновления") private final String lastUpdated;

    @JsonProperty("Размер установочного файла") private final String size;

    @JsonProperty("Текущая версия") private final String currentVersion;

    @JsonProperty("Требуемая версия Android") private final String requiresAndroid;

    @JsonProperty("Внутриигровые покупки") private final String iap;

    @JsonProperty("Связаться с разработчиком") private final String devEmail;

    @Override
    public String toString() {
        return "Название игры: " + title +
                "\nДата последнего обновления: " + lastUpdated +
                "\nТекущая версия: " + currentVersion +
                "\nТребуемая версия Android: " + requiresAndroid +
                "\nРазмер установочного файла: " + size +
                "\nКатегория: " + genre +
                "\nСтоимость игры: " + price +
                "\nВнутриигровые покупки: " + iap +
                "\nСвязаться с разработчиком: " + devEmail;
    }
}



Здесь просто получаю объект с игрой, который я и возвращаю пользователю:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 public GooglePlayGame getGooglePlayGame() {
        return GooglePlayGame.builder()
                .title(parser.parseTitle(document))
                .genre(parser.parseGenre(document))
                .price(parser.parsePrice(document))
                .lastUpdated(parser.parseDateOfLastUpdate(document))
                .size(parser.parseInstallationFileSize(document))
                .currentVersion(parser.parseVersion(document))
                .requiresAndroid(parser.parseRequirements(document))
                .iap(parser.parseIAP(document))
                .devEmail(parser.parseContacts(document))
                .build();
    }



Кусок кода из парсера, на котором и получаю null:
Код: java
1.
2.
3.
4.
5.
@Override
    public String parsePrice(Document document) {
        String price = document.select("meta[itemprop=price]").first().attr("content"); //тут NPE на GTA
        return price.equals("0") ? "Бесплатно" : price;
    }



Кусок из обработчика сообщений:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public GooglePlayGame getParsedGame(String URL) throws NotGooglePlayLinkException, IOException, URISyntaxException {
        return new GooglePlayGameService(getDocument(URL), getParser()).getGooglePlayGame();
    }

    public String getGameTitle(String URL) throws URISyntaxException, IOException, NotGooglePlayLinkException {
        return new GooglePlayGameService(getDocument(URL), getParser()).getGooglePlayGameTitle();
    }

    private Document getDocument(String URL) throws NotGooglePlayLinkException, IOException, URISyntaxException {
        return new GooglePlayConnection().connectToGooglePlay(URL);
    }


Лог ошибки:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
java.lang.NullPointerException: null
	at parser.googleplay.GooglePlayParser.parsePrice(GooglePlayParser.java:59) ~[classes/:?]
	at library.googleplay.service.GooglePlayGameService.getGooglePlayGame(GooglePlayGameService.java:20) ~[classes/:?]
	at bot.commandshandler.GameMessageHandler.getParsedGame(GameMessageHandler.java:32) ~[classes/:?]
	at bot.commandshandler.GameMessageHandler.handleGameMessage(GameMessageHandler.java:53) ~[classes/:?]
	at bot.service.updates.handlers.TextMessageHandler.handleTextMessage(TextMessageHandler.java:36) ~[classes/:?]
	at bot.service.updates.MessageReceiver.handleUpdate(MessageReceiver.java:37) ~[classes/:?]
	at bot.service.Bot.onUpdateReceived(Bot.java:18) ~[classes/:?]
	at java.util.ArrayList.forEach(ArrayList.java:1540) ~[?:?]
	at org.telegram.telegrambots.meta.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27) ~[telegrambots-meta-4.6.jar:?]
	at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:312) [telegrambots-4.6.jar:?]



Я бы понял, что ошибка в логике парсера, если бы я получал NPE на каждой ссылке с игрой, но получаю я эту ошибку только на играх одного разработчика (Rockstar). Еще чуднее чудного: NPE вылетает только при подключении через VPN! Если отключить VPN, ошибки нет. Причем, валится, если "подключаться" из Германии. Пробовал из США - отрабатывает корректно. Всё бы хорошо, но заставить работать бота телеграм без VPN невозможно. А бот скорее всего будет деплоиться в дальнейшем на немецком хостинге.

В принципе, отделил парсер от телеграм бота и ситуация повторяется. Валится он на стоимости и видимо, он не может найти на странице соответствующие атрибуты. Но страницы для всех игр одинаковые, а атрибут один. Почему атрибут пропадает, если страница всегда открывается в русской локализации - для меня загадка. Для этого у меня есть такой костыль:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
private String forceToRusLocalization(String URL) {
        if (URL.endsWith("&hl=ru")){
            return URL;
        }
        else {
            if (URL.contains("&hl=")){
                URL = URL.replace(
                        URL.substring(URL.length()-"&hl=ru".length()), "&hl=ru");
            }
            else {
                URL += "&hl=ru";
            }
        }
        return URL;
    }


Подключение проходит нормально, страница всегда открывается в русской локализации.

Исходя из всего этого, у меня возник вопрос: можно ли принудительно заставить приложение подключаться к Google Play из России? Даже если я подключаюсь к VPN, но использовать российский IP или как там google определяет местоположение. Прокси какой-то использовать? Я очень плохо шарю в сетях, поэтому мне сложно сказать, есть ли иное решение, как просто подобрать "нужный и правильный " VPN.
...
Рейтинг: 0 / 0
Странный NPE то появляется, то исчезает
    #39944670
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
String price = document.select("meta[itemprop=price]").first().attr("content"); //тут NPE на GTA


В данной строчки, дофига операций. Побить по разным строчкам и будете понимать, где конкретно падаете на NPE

document.select
select("meta[itemprop=price]").first
first().attr
...
Рейтинг: 0 / 0
Странный NPE то появляется, то исчезает
    #39944743
Wasteland Rebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev
String price = document.select("meta[itemprop=price]").first().attr("content"); //тут NPE на GTA


В данной строчки, дофига операций. Побить по разным строчкам и будете понимать, где конкретно падаете на NPE

document.select
select("meta[itemprop=price]").first
first().attr

Так он падает на первом же вызове метода, точнее после него, он не может найти атрибут itemprop price конкретно на этой странице. Варианта вижу два: менять VPN и хостинг, либо как-то вручную прописывать подключение. Хотелось бы попробовать второй вариант, но я не знаю как.
...
Рейтинг: 0 / 0
Странный NPE то появляется, то исчезает
    #39944753
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wasteland Rebel

он не может найти атрибут itemprop price конкретно на этой странице.

Ну так и разбирайся, почему на страница нет атрибута.
Как минимум, формируй корректное сообщение об ошибке.
...
Рейтинг: 0 / 0
Странный NPE то появляется, то исчезает
    #39944754
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поясню свою мысль, если Web сервер не включен в розетку 220 вольт, то логично, что
Wasteland Rebel

он не может найти атрибут itemprop price конкретно на этой странице.

Но очень странно задавать вопрос на форуме Java:
"Странный NPE то появляется, то исчезает
..
Всё получилось, работает как надо. Но встретил необъяснимую загадку: когда Web сервер не включен в розетку, вылетает NPE ."
...
Рейтинг: 0 / 0
Странный NPE то появляется, то исчезает
    #39945152
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zzz79
Я так понимаю ты из РФ - поэтому при тестах юзаешь vpn - как ты сам говоришь бот будет деплоиться на сервера в германии- то и впн тебе не нужен и проблем не будет

для проверки можешь задеплоить своего бота на хероку - и посмотреть как будет работать


ИМХО лучше подумать, когда сервис будет не доступен. Чтобы программы выдавала что-то осмысленное, а не NPE :-)
...
Рейтинг: 0 / 0
Странный NPE то появляется, то исчезает
    #39945278
Wasteland Rebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgul
Zzz79
Я так понимаю ты из РФ - поэтому при тестах юзаешь vpn - как ты сам говоришь бот будет деплоиться на сервера в германии- то и впн тебе не нужен и проблем не будет

для проверки можешь задеплоить своего бота на хероку - и посмотреть как будет работать


ИМХО лучше подумать, когда сервис будет не доступен. Чтобы программы выдавала что-то осмысленное, а не NPE :-)

Так в итоге и сделал, решил изменить логику + добавил проверку на null. Если null, то просто вываливается "Информация не доступна".
...
Рейтинг: 0 / 0
Странный NPE то появляется, то исчезает
    #39945285
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wasteland Rebel
Так в итоге и сделал, решил изменить логику + добавил проверку на null. Если null, то просто вываливается "Информация не доступна".

прогеры делают наоборот:
- сначала пишут код с проверкой в каждой строке и каждом операторе. Если новчОк.
После того как каждый оператор под контролем можно заниматься БЛ и вставлять if\case\goto
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Странный NPE то появляется, то исчезает
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]