Java Bukkit空指针配置

Java Bukkit空指针配置,java,Java,我正在制作一个bukkit插件,它使用配置来存储数据,但是当我使用plugin.getConfig()时,我会得到一个空指针。为什么?空指针位于存储类中 主要内容: 存储:只有一件事可以在该行抛出NullPointerException,那就是对插件的引用 在代码中,您可以调用Storage.addClickCmd,而无需首先构造Storage实例。plugin字段只能为空。当您尝试在null引用上调用方法时,会得到一个NullPointerException。Storage.plugin变量是

我正在制作一个bukkit插件,它使用配置来存储数据,但是当我使用
plugin.getConfig()
时,我会得到一个空指针。为什么?空指针位于存储类中

主要内容:


存储:

只有一件事可以在该行抛出NullPointerException,那就是对
插件的引用


在代码中,您可以调用
Storage.addClickCmd
,而无需首先构造
Storage
实例。
plugin
字段只能为空。当您尝试在null引用上调用方法时,会得到一个NullPointerException。

Storage.plugin变量是在Storage的构造函数上设置的。只有在创建新的存储实例时,才会调用此构造函数。您将
插件设置为static,这意味着您不需要存储实例来访问它,因此您不需要使用
新存储()
创建一个存储实例。这意味着,虽然您可以访问变量,但您的代码从不设置它。您有两个选择:

  • 插件
    变量创建一个setter:
  • 这似乎是您需要的解决方案,因为您的所有方法都是静态的。首先删除构造函数:

    public Storage(Main instance) {
    plugin = instance;
    }
    
    然后用setter替换它,setter只是一个静态方法,就像代码中的其他方法一样:

    public static void setPlugin(Main instance) {
        plugin = instance;
    }
    
  • 插件
    和所有存储方法设置为非静态:
  • 此解决方案更好地遵循面向对象编程,并且在服务器重新加载时可以帮助重置插件。首先通过删除
    static
    关键字,使
    plugin
    变量和所有方法非静态:

        Main plugin;
        ...
          public void addClickCmd(Location loc, String text) {
            ...
          }
    
          public String getClickCmd(String w, int x, int y, int z) {
            ...
          }
    
          public String getString(String path) {
            ...
          }
    
    然后在保存存储对象的主类中创建一个新变量,并将其设置为
    onEnable()
    中的一个新实例:

    this
    关键字指向插件本身。之后,更改其余代码以使用此新变量:

    storage.addClickCmd(bl, allArgs);
    ...
    if(storage.getClickCmd(w, x, y, z) != null) {
        String cCc2 = storage.getString(cCc);
    

    当我这样做时,如果(plugin!=null&&plugin.getConfig()!=null){System.out.println(“Check”)}我没有收到消息,因为plugin是null。向我显示您所说的
    新存储(…
    storage.addClickCmd(bl, allArgs);
    ...
    if(storage.getClickCmd(w, x, y, z) != null) {
        String cCc2 = storage.getString(cCc);