我正在制作一个使用配置来存储数据的bukkit插件,但是当我使用plugin.getConfig()
时,我得到了一个NullPointer。为什么? NullPointer位于Storage类中。
答案 0 :(得分:0)
只有一件事可以在该行上抛出NullPointerException,这是对plugin
的引用。
在您的代码中,您无需先构建Storage.addClickCmd
实例即可调用Storage
。 plugin
字段只能为null。当您尝试在空引用上调用方法时,会出现NullPointerException。
答案 1 :(得分:0)
Storage.plugin变量在Storage的构造函数上设置。仅当您创建存储的新实例时,才会调用此构造函数。您已将plugin
设置为 static ,这意味着您不需要存储实例来访问它,因此您不会使用new Storage()
创建一个实例。这意味着,虽然您可以访问变量,但您的代码永远不会设置它。您有两种选择:
plugin
变量创建 setter :这似乎是您需要的解决方案,因为您拥有所有方法 static 。首先删除构造函数:
public Storage(Main instance) {
plugin = instance;
}
然后用一个setter替换它,这只是一个静态方法,就像代码中的其他方法一样:
public static void setPlugin(Main instance) {
plugin = instance;
}
plugin
和所有存储方法设置为非静态:此解决方案更好地遵循面向对象的编程,并且可以在重新加载服务器时帮助重置插件。首先删除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);