gpt4 book ai didi

java - Discord JDA Bot 在调用扩展类时抛出 NullPointerException

转载 作者:行者123 更新时间:2023-11-30 05:18:43 26 4
gpt4 key购买 nike

我目前正在尝试在 JDA 中编写一个非常基本的 Discord 机器人,并且在尝试将我的代码整齐地分成主类、MessageHandler 时遇到了一个问题。 >CommandHandlerVoiceHandler 类。

如果收到事件,主类将添加一个事件监听器来调用 MessageHandler,如果在命令之前看到机器人前缀,则分支到 CommandHandler。

问题是,当它尝试使用 new CommandHandler.handleCmd 调用 CommandHandler 时,它会抛出 NullPointerException。错误消息显示 “ERROR JDA - One of the EventListeners had an uncaught exception” 但如果我没记错的话,它应该只分支到 CommandHandler 类的 handleCmd 函数。所以我不明白为什么它会产生错误。

任何帮助将不胜感激!

这是我的主课

import net.dv8tion.jda.api.AccountType;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Activity;
import net.dv8tion.jda.api.hooks.ListenerAdapter;

import javax.security.auth.login.LoginException;

public class Main extends ListenerAdapter {
public static void main(String[] args) throws LoginException {
JDABuilder builder = new JDABuilder(AccountType.BOT);
String token = "somethingsomething";
builder.setToken(token);
builder.addEventListeners(new MessageHandler()); //Puts Eventlistener to trigger MessageHandler

builder.build();
}
}

这应该触发我的 MessageHandler

import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;

public class MessageHandler extends ListenerAdapter {
protected String userName;
protected String userMessage;
protected MessageReceivedEvent event;

public void onMessageReceived(MessageReceivedEvent event) {
userName = event.getAuthor().getName();
userMessage = event.getMessage().getContentRaw();
this.event = event;

if (event.getAuthor().isBot()) {
return;
} else if (userMessage.startsWith(">")) {
new CommandHandler().handleCmd(); //Should trigger CommandHandler (this is the problem)
}
}
}

然后分支到CommandHandler

public class CommandHandler extends MessageHandler {
private String command = userMessage.substring(1);

public void handleCmd() {
switch (command) {
case "join":
new VoiceHandler().join();
break;
case ... :
...
break;
case ... :
...
break;
}
}
}

VoiceHandler.join() 方法只是让机器人连接到我的语音 channel ,但现在应该无关紧要

如果有帮助的话,这里还有完整的错误消息

[JDA MainWS-ReadThread] ERROR JDA - One of the EventListeners had an uncaught exception
java.lang.NullPointerException
at CommandHandler.<init>(CommandHandler.java:2)
at MessageHandler.onMessageReceived(MessageHandler.java:17)
at net.dv8tion.jda.api.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:376)
at net.dv8tion.jda.api.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:96)
at net.dv8tion.jda.internal.hooks.EventManagerProxy.handle(EventManagerProxy.java:64)
at net.dv8tion.jda.internal.JDAImpl.handleEvent(JDAImpl.java:151)
at net.dv8tion.jda.internal.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:122)
at net.dv8tion.jda.internal.handle.SocketHandler.handle(SocketHandler.java:36)
at net.dv8tion.jda.internal.requests.WebSocketClient.onDispatch(WebSocketClient.java:853)
at net.dv8tion.jda.internal.requests.WebSocketClient.onEvent(WebSocketClient.java:741)
at net.dv8tion.jda.internal.requests.WebSocketClient.handleEvent(WebSocketClient.java:720)
at net.dv8tion.jda.internal.requests.WebSocketClient.onBinaryMessage(WebSocketClient.java:891)
at com.neovisionaries.ws.client.ListenerManager.callOnBinaryMessage(ListenerManager.java:385)
at com.neovisionaries.ws.client.ReadingThread.callOnBinaryMessage(ReadingThread.java:276)
at com.neovisionaries.ws.client.ReadingThread.handleBinaryFrame(ReadingThread.java:996)
at com.neovisionaries.ws.client.ReadingThread.handleFrame(ReadingThread.java:755)
at com.neovisionaries.ws.client.ReadingThread.main(ReadingThread.java:108)
at com.neovisionaries.ws.client.ReadingThread.runMain(ReadingThread.java:64)
at com.neovisionaries.ws.client.WebSocketThread.run(WebSocketThread.java:45)

最佳答案

堆栈跟踪告诉您异常发生在哪一行(CommandHandler 的第 2 行)。

您的字段userMessagenull并且您正在对其执行方法调用。如果未在 CommandHandler 中设置 userMessage,就会发生这种情况。

以下代码

userMessage = event.getMessage().getContentRaw(); 

仅在当前MessageHandler对象中设置userMessage。这些值不与新创建的 CommandHandler 对象共享。您需要使用构造函数或使用方法参数显式设置它们。您还可以将这些字段更改为静态字段。

使用构造函数看起来如何:

public class CommandHandler extends MessageHandler {
private String command;

/**
* You can add more parameters to this constructor or also a MessageHandler object.
**/
public CommandHandler(String userMessage){
if(userMessage != null){
this.comand = userMessage.substring(1);
}
}

public void handleCmd() {
switch (command) {
case "join":
new VoiceHandler().join();
break;
case ... :
...
break;
case ... :
...
break;
}
}
}

对象创建将如下所示:

if (event.getAuthor().isBot()) {
return;
} else if (userMessage.startsWith(">")) {
new CommandHandler(userMessage).handleCmd();
}
<小时/>

问题是为什么需要扩展MessageHandler?您将其用作实用程序类,因此我建议将其更改为实用程序类:

public final class CommandHandler {

public static void handleCmd(String userMessage) {
if(userMessage == null){
return;
}
String command = userMessage.substring(1);

switch (command) {
case "join":
new VoiceHandler().join();
break;
case ... :
...
break;
case ... :
...
break;
}
}
}

以及该方法的调用:

CommandHandler.handleCmd(userMessage);

关于java - Discord JDA Bot 在调用扩展类时抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59904314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com