Java开发的Discord Ping-Pong机器人持续发送pong无法停止问题排查
解决Discord Ping-Pong机器人无限发送"pong"的问题
嘿,我一眼就揪出你代码里的问题啦——这是个新手很容易踩的小坑!
核心错误:多余的分号
看你的PingPong类里的这段代码:
if (e.getMessage().getContentRaw().equals("!ping"));{ e.getChannel().sendMessage("pong").queue(); }
注意到if条件后面的那个分号了吗?这个分号会让if的条件判断变成一个空语句,后面的大括号代码块就变成了无条件执行的代码——不管收到的消息是不是!ping,都会发送pong。
为什么会无限循环?
当机器人发送pong之后,它自己会接收到这条频道消息(因为它是频道成员),然后再次触发onMessageReceived事件,再次执行发送pong的代码,就这样陷入了无限循环,停都停不下来!
修正后的代码
把那个多余的分号删掉就好,同时建议你加上判断,排除机器人自己发送的消息,从根源避免这类循环:
import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; public class PingPong extends ListenerAdapter{ @Override public void onMessageReceived(MessageReceivedEvent e){ // 先排除机器人自己的消息,避免触发循环 if (e.getAuthor().isBot()) return; if (e.getMessage().getContentRaw().equals("!ping")){ e.getChannel().sendMessage("pong").queue(); } } }
额外小提示
- 如果你以后要做更复杂的命令,可以考虑使用JDA的
CommandClient或者第三方命令框架,能更灵活地处理命令匹配 - 用
getContentRaw()判断命令虽然简单,但如果消息前后有空格就会匹配失败,也可以考虑用trim()处理一下:e.getMessage().getContentRaw().trim().equals("!ping")
内容的提问来源于stack exchange,提问作者Patryk Gasior
相关产品推荐
相关产品推荐

