我一直在使用 Java 来使用 YouTube API v3,但遇到了问题。
当尝试在数组中设置变量时,我收到 NullPointerException。这看起来完全是随机且不可能的。我在这条线上得到了这个:
full[0] = snippet.getDisplayMessage().toLowerCase();
在此方法中:
private static void listChatMessages(
final String liveChatId,
final String nextPageToken,
long delayMs) {
System.out.println(
String.format("Getting chat messages in %1$.3f seconds...", delayMs * 0.001));
Timer pollTimer = new Timer();
pollTimer.schedule(
new TimerTask() {
@Override
public void run() {
try {
// Get chat messages from YouTube
LiveChatMessageListResponse response = youtube
.liveChatMessages()
.list(liveChatId, "snippet, authorDetails")
.setPageToken(nextPageToken)
.setFields(LIVE_CHAT_FIELDS)
.execute();
// Display messages and super chat details
List<LiveChatMessage> messages = response.getItems();
for (int i = 0; i < messages.size(); i++) {
LiveChatMessage message = messages.get(i);
LiveChatMessageSnippet snippet = message.getSnippet();
final String[] full = new String[2];
full[0] = snippet.getDisplayMessage().toLowerCase();
full[1] = message.getId();
ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
es.submit(new Runnable() {
public void run() {
PressKey.main(full);
}
});
}
// Request the next page of messages
listChatMessages(
liveChatId,
response.getNextPageToken(),
response.getPollingIntervalMillis());
} catch (Throwable t) {
System.err.println("Throwable: " + t.getMessage());
t.printStackTrace();
}
}
}, delayMs);
}
}
最佳答案
我不完全确定 API 是如何实现的,但发生这种 NPE 是因为
snippet.getDisplayMessage()
为 null
,并且在 null
上调用 .toLowerCase()
会导致 NPE。
就像我说的,我不确定 API 和容器类是如何实现的,但看起来 getDisplayMessage()
并不总是保证返回任何内容。
您可以通过检查空值并提供默认值来修复 NPE:
full[0] = snippet.getDisplayMessage() == null ? "" : snippet.getDisplayMessage().toLowerCase();
这里,如果 getDisplayMessage()
为 null
,我们将空字符串分配给 full[0]
。
关于java - YouTube API v3 中的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47734202/