Spigot插件调用ThreadLocalRandom.nextInt报bound must be positive错误如何解决
问题原因
java.lang.IllegalArgumentException: bound must be positive 是ThreadLocalRandom.nextInt(int bound)方法的典型报错,该方法要求传入的边界参数必须为正整数,你代码中传入的是mapNames.length,说明执行到该行时mapNames数组长度为0,是空数组。
结合代码逻辑可以定位到根因:你调用mapsConfiguration.getKeys(false)拿到的键集合是空的,要么是配置文件中mapsConfiguration对应的节点下没有配置任何子地图项,要么是mapsConfiguration初始化时读取的配置路径错误,没有加载到正确的配置节点。从错误栈也可以确认,报错位置就是该随机取地图名称的方法,完全匹配参数非法的场景。
解决方案
1. 先加前置校验避免报错
修改randomMapName方法,在调用随机方法前先判断数组是否为空,提前抛出明确的业务提示或者返回默认值,避免触发随机数的非法参数异常:
public String randomMapName() { String[] mapNames = mapsConfiguration.getKeys(false).toArray(new String[]{}); // 新增非空校验 if (mapNames.length == 0) { // 二选一即可: // 方案A:抛出明确异常,方便排查配置问题 throw new IllegalStateException("未读取到任何可用地图,请检查配置文件的地图配置项是否正确"); // 方案B:返回预设的默认地图名,兼容无配置的场景 // return "default_bedwars_map"; } return mapNames[ThreadLocalRandom.current().nextInt(mapNames.length)]; }
2. 排查配置加载逻辑
- 检查你的插件配置文件中,
mapsConfiguration对应的节点下是否有正确配置地图项,注意YAML配置的缩进、键名拼写是否符合预期 - 检查
mapsConfiguration的赋值逻辑,确认你读取配置的路径和配置文件中的结构完全匹配,没有因为配置文件未加载、路径写错导致拿到空的配置节点
3. 新增启动校验
可以在插件onEnable方法中提前调用一次校验逻辑,检测是否存在可用地图,如果为空直接在控制台打印错误日志提示管理员配置异常,避免运行到游戏逻辑时才触发报错。
内容的提问来源于stack exchange,提问作者mlagie
相关产品推荐
相关产品推荐

