Spigot插件启动报IllegalArgumentException错误求助
问题分析:Spigot插件启动时的IllegalArgumentException错误
错误信息
[16:43:41] [Server thread/ERROR]: Error occurred while enabling CustomServer v1.0-SNAPSHOT (Is it up to date?) java.lang.IllegalArgumentException: Invalid key. Must be [a-z0-9/._-]: Custom at com.google.common.base.Preconditions.checkArgument(Preconditions.java:220) ~[guava-31.1-jre.jar:?] at org.bukkit.NamespacedKey.<init>(NamespacedKey.java:84) ~[spigot-api-1.20-R0.1-SNAPSHOT.jar:?] at org.bukkit.NamespacedKey.minecraft(NamespacedKey.java:175) ~[spigot-api-1.20-R0.1-SNAPSHOT.jar:?] at me.entropire.customserver.CustomServer.onEnable(CustomEntropireServer.java:30) ~[?:?] ...(后续错误栈省略)
相关代码(CoinBag类)
package me.user.customserver; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import java.io.*; import java.util.Arrays; import java.util.List; public class CoinBag implements Listener { @EventHandler public void OnPlayerInterect(PlayerInteractEvent event) { Player player = event.getPlayer(); if (player.getInventory().getItemInMainHand().getType() == Material.LEATHER_HORSE_ARMOR){ if (player.getInventory().getItemInMainHand().getItemMeta().getCustomModelData() == 1015) { ItemMeta meta = player.getInventory().getItemInMainHand().getItemMeta(); if (player.getInventory().getItemInMainHand().getItemMeta().hasLore()) { String id = meta.getLore().toString(); id = id.replaceAll("C", ""); id = id.replaceAll("i", ""); id = id.replaceAll("o", ""); id = id.replaceAll("n", ""); id = id.replaceAll("b", ""); id = id.replaceAll("a", ""); id = id.replaceAll("g", ""); id = id.replaceAll(" ", ""); String fileName = id + ".yml"; Inventory inv = Bukkit.createInventory(player, 18, "CoinBag " + id); File file = new File("plugins/CustomServer/" + fileName); FileConfiguration config = YamlConfiguration.loadConfiguration(file); if (file.exists()){ ItemStack[] contents = ((List<ItemStack>) config.get("CoinBag.contents")).toArray(new ItemStack[0]); inv.setContents(contents); } player.openInventory(inv); } } } } @EventHandler private void onPlayerExitInv(InventoryCloseEvent e) throws IOException { if (e.getView().getTitle().contains("CoinBag")){ String name_inv = e.getView().getTitle(); name_inv = name_inv.replaceAll("C", ""); name_inv = name_inv.replaceAll("i", ""); name_inv = name_inv.replaceAll("o", ""); name_inv = name_inv.replaceAll("n", ""); name_inv = name_inv.replaceAll("B", ""); name_inv = name_inv.replaceAll("a", ""); name_inv = name_inv.replaceAll("g", ""); name_inv = name_inv.replaceAll(" ", ""); ItemStack[] contants = e.getInventory().getContents(); String fileName = name_inv + ".yml"; File file = new File("plugins/CustomServer/" + fileName); FileConfiguration c = YamlConfiguration.loadConfiguration(file); c.set("CoinBag.contents", contants); c.save(file); } } }
错误根源分析
错误的核心原因不在CoinBag类的id = id.replaceAll(" ", "");或name_inv = name_inv.replaceAll(" ", "");两行,而是来自CustomServer类onEnable方法的第30行代码:
错误栈明确显示,问题出在调用NamespacedKey.minecraft("Custom")时,传入的字符串"Custom"不符合Spigot对NamespacedKey的命名规则——要求key只能包含小写字母(a-z)、数字(0-9)以及/ . _ -这些符号,而"Custom"中的大写字母C违反了该规则,直接触发了IllegalArgumentException。
你移除那两行后错误消失属于巧合(比如插件加载流程中其他逻辑未执行到错误代码,或服务器缓存影响),但这两行代码本身是用于处理CoinBag的ID字符串,和启动时的错误完全无关,移除后自然会导致插件功能异常。
修复方案:找到CustomServer类中创建NamespacedKey的代码,将"Custom"改为全小写的"custom",符合命名规范即可解决启动错误。
内容的提问来源于stack exchange,提问作者Entropire
相关产品推荐
相关产品推荐

