Java开发Discord JDA机器人跨类调用方法无响应问题排查
问题排查与修复
先澄清那个终端报错的本质
你看到的PowerShell报错和Java代码本身、机器人运行逻辑完全无关:这是VS Code在拼接启动程序的终端命令时,错误把代码里的white字符串当成了终端指令放在命令最前面,导致PowerShell识别不到这个命令。只要你的Java代码能正常编译,这个报错可以直接忽略,不影响机器人运行。
真正导致机器人不响应指令的代码bug
- 非法的数组下标记法
你写的args [0-100].equalsIgnoreCase("white")不是合法Java语法,Java不支持这种范围式的下标写法。结合你前面几个指令的判断逻辑,所有触发判断都是匹配消息开头的args[0](也就是带机器人前缀的指令词),这里的范围写法完全是手滑写错,直接导致指令匹配逻辑失效,自然识别不到用户发的指令。 - 类类型不匹配的编译错误
你写的Race newColorobj = new Color();是把Color类的实例赋值给Race类型的变量,只要两个类没有继承关系,这行代码根本无法编译通过,大概率是写代码的时候手滑打错了类名。 - 随机数逻辑写死,根本实现不了随机效果
你的Color类里有三个逻辑问题:- 随机数上限写死为
1,rand.nextInt(1)永远只会返回0,从参数层面就没有随机空间 - 随机数变量是类成员,只会在对象创建时生成一次,不是每次调用方法时动态生成,就算列表加了多个内容也永远取固定下标的元素
- 每次调用
white()方法都重新创建空的ArrayList、塞测试内容,完全冗余,没有复用已有的文本池
- 随机数上限写死为
修复后的代码参考
修复版Color.java
import java.util.ArrayList; import java.util.Random; public class Color { // 文本池、随机生成器只初始化一次,避免重复创建开销 private final ArrayList<String> whiteTextPool = new ArrayList<>(); private final Random rand = new Random(); public Color() { // 所有随机可选文本在这里一次性加入列表,后续加内容直接往这里append就行 whiteTextPool.add("This is a test"); } public String white() { // 根据当前列表实际长度生成随机下标,实现真正的随机抽取 int randomIndex = rand.nextInt(whiteTextPool.size()); return whiteTextPool.get(randomIndex); } }
修复版Commands.java指令块
else if (args[0].equalsIgnoreCase(bot.prefix + "white")){ // 修正错误的类类型,统一和前面的指令逻辑匹配带前缀的指令 Color newColorobj = new Color(); String white_test = newColorobj.white(); event.getChannel().sendMessage(white_test + ".").queue(); }
内容的提问来源于stack exchange,提问作者colinkehoe
相关产品推荐
相关产品推荐

