Bukkit nullpointer配置

时间:2014-07-23 12:02:34

标签: java

我正在制作一个使用配置来存储数据的bukkit插件,但是当我使用plugin.getConfig()时,我得到了一个N​​ullPointer。为什么? NullPointer位于Storage类中。

主要:http://pastebin.com/d3bFXbiR

存储:http://pastebin.com/wvQS3n57

2 个答案:

答案 0 :(得分:0)

只有一件事可以在该行上抛出NullPointerException,这是对plugin的引用。

在您的代码中,您无需先构建Storage.addClickCmd实例即可调用Storageplugin字段只能为null。当您尝试在空引用上调用方法时,会出现NullPointerException。

答案 1 :(得分:0)

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

  1. plugin变量创建 setter
  2. 这似乎是您需要的解决方案,因为您拥有所有方法 static 。首先删除构造函数:

    public Storage(Main instance) {
    plugin = instance;
    }
    

    然后用一个setter替换它,这只是一个静态方法,就像代码中的其他方法一样:

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

          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) {
              ...
            }
      

      然后在Main类中创建一个新变量,该变量保存Storage对象并将其设置为onEnable()中的新实例:

      public class Main extends JavaPlugin{
      
          public Storage storage;
          public void onEnable() {
                  final FileConfiguration config = this.getConfig();
      
                  config.options().copyDefaults(true);
                  saveConfig();
      
                  storage = new Storage(this);
          }
      

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

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