JDA中lambda赋值的数组消息ID为null问题及实现方案咨询
问题原因
你遇到的数组值为null的核心原因是JDA的queue()方法为异步执行逻辑:
调用sendMessage("xxx").queue(回调)时,代码不会等待消息真的发送到Discord服务端拿到返回结果,而是会立刻向下执行后续的addReactionById逻辑。你用来存储ID的数组赋值操作是在消息发送成功后的回调里才会执行,执行顺序晚于你加反应的代码,所以读取到的数组值始终为null。
你把加反应逻辑移入lambda后仍然报错,大概率是代码写法有误,比如依然调用了addReactionById传入还未赋值的ID、或是额外调用了getMessageById查还未存储的消息ID,实际上回调内已经能直接拿到发送完成的消息对象,不需要再通过ID查询。
最优解决方案
方案1:异步回调写法(推荐)
直接在queue的回调内用返回的Message对象添加反应,不需要额外存储消息ID,性能最优不会阻塞线程:
event.getChannel().sendMessage("This is a message").queue(message -> { // 直接用回调返回的已发送消息对象添加反应 message.addReaction("\u1F1E6").queue(); message.addReaction("\u1F1E7").queue(); message.addReaction("\u1F1E8").queue(); });
方案2:同步阻塞写法(适合需要同步拿到消息对象的特殊场景)
如果确实需要在发送逻辑后续拿到消息对象做其他操作,可以用complete()替代queue(),该方法会阻塞当前线程直到消息发送完成,直接返回已发送的消息对象:
// 同步发送,阻塞到消息发送成功为止 Message botMessage = event.getChannel().sendMessage("This is a message").complete(); botMessage.addReaction("\u1F1E6").queue(); botMessage.addReaction("\u1F1E7").queue(); botMessage.addReaction("\u1F1E8").queue();
注意不要在JDA的事件回调线程内频繁使用complete(),避免阻塞事件分发导致机器人响应延迟。
内容的提问来源于stack exchange,提问作者ghost1034
相关产品推荐
相关产品推荐

