You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Spigot插件开发:自定义数据管理器无法保存数据问题求助

问题排查及修复方案

已确认的代码错误

  • 类名拼写不统一
    你的主类命名为GPlugin,但两处出现了错误拼写:
    1. DataManager类构造函数参数写为GenPlugin plugin,和实际传入的类型不匹配
    2. 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作为序号,会导致多个玩家的序号连续增长,不是每个玩家独立计数,和你期望的结构不符。

修复方案

  1. 统一所有类名拼写为GPlugin,修正DataManager构造函数参数、GPlace类中的类名引用。
  2. 修改GPlugin的saveData()方法返回值为void,不需要返回值:
public static void saveData() {
    data.saveConfig();
}
  1. 修改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();
}
  1. 你提供的IO报错和插件存储逻辑无关,属于服务端终端控制台的句柄错误,一般是启动服务端时未正确分配终端窗口导致,不影响插件功能。

内容的提问来源于stack exchange,提问作者user16610513

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:12:02