Java Spigot插件开发:自定义数据管理器无法保存数据问题求助
问题排查及修复方案
已确认的代码错误
- 类名拼写不统一
你的主类命名为GPlugin,但两处出现了错误拼写:DataManager类构造函数参数写为GenPlugin plugin,和实际传入的类型不匹配GPlace类中判断逻辑写为if (GenPlugin.getData().contains("data")),类名拼写错误
- YAML存储路径层级错误
你期望的存储结构是data.<玩家UUID>.<序号>.<属性>,但你实际拼接的路径是"data." + player.getUniqueId() + var,UUID和序号之间缺少.分隔符,会导致两者直接拼接成一个字符串,无法生成正确的二级、三级节点。 - 初始写入逻辑拦截
你用if (GPlugin.getData().contains("data"))包裹了所有写入逻辑,首次运行时data.yml中不存在data节点,会直接跳过所有写入操作,永远无法生成第一条数据。 - 方法返回值类型不匹配
DataManager类的saveConfig()方法是void无返回值,但GPlugin类中的saveData()方法定义返回FileConfiguration类型,return data.saveConfig()会直接编译报错。 - 序号计数逻辑错误
你当前拿data节点下所有键的总数量+1作为序号,会导致多个玩家的序号连续增长,不是每个玩家独立计数,和你期望的结构不符。
修复方案
- 统一所有类名拼写为
GPlugin,修正DataManager构造函数参数、GPlace类中的类名引用。 - 修改
GPlugin的saveData()方法返回值为void,不需要返回值:
public static void saveData() { data.saveConfig(); }
- 修改
GPlace类中的写入逻辑,去掉contains("data")的限制,修正路径拼接,调整序号计数逻辑,同时增加空判断避免空指针异常:
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void onBlockPlace(BlockPlaceEvent evt) { Block block = evt.getBlock(); Player player = evt.getPlayer(); ItemMeta meta = evt.getItemInHand().getItemMeta(); if (meta == null || !meta.getDisplayName().equals("§7Dirt Gen [Tier I]")) { return; } player.sendMessage("Worked!"); String uuidStr = player.getUniqueId().toString(); int var = 1; // 取当前玩家的子节点计数,实现每个玩家独立序号 if (GPlugin.getData().isConfigurationSection("data." + uuidStr)) { var = GPlugin.getData().getConfigurationSection("data." + uuidStr).getKeys(false).size() + 1; } String basePath = "data." + uuidStr + "." + var; GPlugin.getData().set(basePath + ".type", "Dirt Gen"); GPlugin.getData().set(basePath + ".x", (int) block.getLocation().getX()); GPlugin.getData().set(basePath + ".y", (int) block.getLocation().getY()); GPlugin.getData().set(basePath + ".z", (int) block.getLocation().getZ()); GPlugin.getData().set(basePath + ".world", block.getLocation().getWorld().getName()); GPlugin.saveData(); }
- 你提供的IO报错和插件存储逻辑无关,属于服务端终端控制台的句柄错误,一般是启动服务端时未正确分配终端窗口导致,不影响插件功能。
内容的提问来源于stack exchange,提问作者user16610513
相关产品推荐
相关产品推荐

