为什么这个代码会在睡眠时导致NPE,以避免Twitter4J中的速率限制?

时间:2017-02-11 19:01:29

标签: java twitter twitter4j ratelimit

我正在使用Twitter4j来获取给定用户的关注者。在某些时候,我总是达到速率限制。我很高兴节目睡了15分钟就可以了。但是当它醒来时,我收到了一个错误。

请参阅以下代码:

protected IDs fetchAndStoreFollowers(TwitterUser user) {
    Twitter twitter = this.getTwitterApi();
    long cursor = -1;
    IDs ids = null;
    do {
        try {
            ids = twitter.getFollowersIDs(user.getId(), cursor);
            System.out.println("Got a followers batch");
            cursor = ids.getNextCursor();
            this.storeFollowers(user, ids);
            System.out.println("Saved!");
        } catch (TwitterException e) {
            System.out.println("Oh no! Rate limit exceeded... going to sleep.");
            handleTwitterException(e);
            System.out.println("Waking up!");
        }
    } while (ids.hasNext());
    return ids;
}

从睡眠中醒来后,程序会在此行上抛出NullPointerException

} while (ids.hasNext());

有人可以找到原因吗?

1 个答案:

答案 0 :(得分:2)

遇到错误的原因是可重现的并且非常符合逻辑。

首先,您将ids初始化为null

如果发生RateLimitException(TwitterException),则不会在以下行中的变量ids中设置实际值:

ids = twitter.getFollowersIDs(user.getId(), cursor);

然后执行catch - 阻止代码 - 而ids仍指向null。处理完毕后(并在控制台上看到输出...),行:

while (ids.hasNext());

生成NullPointerException

解决方案

按如下方式更改时间条件:

while (ids == null || (id!=null && ids.hasNext()));

请注意,如果出现错误,cursor中的值可能没有或必须相应更改。

希望这有帮助。