【问题标题】:SnakeYAML loadAs() returns nullSnakeYAML loadAs() 返回 null
【发布时间】:2018-05-06 22:20:47
【问题描述】:

我今天尝试创建一个 Spigot 插件,但遇到了一个难以修复的错误。当我试图创建一个文件系统来保存一些数据时,我下载了库 SnakeYAML 的源代码并将其放入我的 src.xml 文件中。然后我按照this tutorial 创建了一个配置并按照所有说明进行操作。我得到一个 NullPointerException。原来配置对象是空的。我不确定发生了什么。

PlayerYML getConfig(File playerYml) {
    try {
        InputStream ymlStream = new FileInputStream(playerYml.getAbsolutePath());
        System.out.println(ymlStream);
        PlayerYML config = yaml.loadAs(ymlStream, PlayerYML.class);
        return config;
    } catch (Exception ex) {
        System.out.println("getConfig() error");
        ex.printStackTrace();
        return null;
    }
}

这是我的 PlayerYML 类:

import java.util.Map;

public class PlayerYML {

    private int reputation;
    private Map<String/*UUID*/, String/*Date*/> map;

    public int getReputation() {
        return reputation;
    }

    public void setReputation(int reputation) {
        this.reputation = reputation;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    } 
}

感谢所有帮助!谢谢你:)

【问题讨论】:

  • 您的 PlayerYML 类是相关的,请在此处添加。您确定文件存在于您尝试从中加载的路径中吗?
  • 是的,我确定它存在...我用 createNewFile() 创建了它。
  • 它的内容呢?如果文件为空或无效,snakeyaml 可能会返回 null
  • 它是空的。我正在尝试使用 PlayerYML 创建 yaml
  • 如果 YAML 输入文件为空,loadAs 返回 null 是预期行为,因为您提供的 YAML 流不包含任何文档。

标签: java yaml minecraft


【解决方案1】:

您正在尝试在对象上加载一个空文件/流,这将导致使用 SnakeYAML 为空。

如果你想正确处理文件的缺失而不是仅仅创建一个空文件,你应该检查它是否存在,如果文件不存在则直接创建对象的默认实例。如果您想创建具有默认值的文件以供用户编辑,只需使用 Yaml.dump* 方法之一存储对象的默认实例即可。这样你就可以避免自己创建一个空对象。如果出现用户错误,您仍然需要处理空文件。

【讨论】:

    【解决方案2】:

    发生在我身上的是我的 InputStream 已经完全被上面的 BufferedReader 消耗了,所以 Stream 中没有任何东西需要处理。

    我必须做的是重置 InputStream 或者只是打开一个新的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 2020-06-19
      • 2011-10-15
      • 2014-06-28
      相关资源
      最近更新 更多