Java 尝试在其他类中修改HashMap时使用NPE

Java 尝试在其他类中修改HashMap时使用NPE,java,Java,我试图将键和值放入另一个类的HashMap中。NPE不应该发生。我的实例设置正确,因为我可以毫无问题地访问RingCreation中的方法,但是当我尝试将对象放入Main中的HashMap时,它返回空指针错误,但是当我生成HashMap的调试消息时,它检测到它不是空的。我不想成为一个讨厌的张贴“又一个NPE”日志。我通常能够修复出现的大多数错误 主类 HashMap<Integer,ItemStack> ringHolder = new HashMap<Integer,Item

我试图将键和值放入另一个类的HashMap中。NPE不应该发生。我的实例设置正确,因为我可以毫无问题地访问RingCreation中的方法,但是当我尝试将对象放入Main中的HashMap时,它返回空指针错误,但是当我生成HashMap的调试消息时,它检测到它不是空的。我不想成为一个讨厌的张贴“又一个NPE”日志。我通常能够修复出现的大多数错误

主类

HashMap<Integer,ItemStack> ringHolder = new HashMap<Integer,ItemStack>();
private RingCreation createRing;

private static Main instance;

public Main() {
    this.createRing = new RingCreation();

}

@Override
public void onEnable() {
    if(ringHolder.isEmpty()) System.out.println("ringholder is empty");
    instance = this;
    createRing.CreateLifeRing();
    createRing.CreateRegenerationRing();
    createRing.CreateStarterRing();
}

public static Main getInstance() {
    return instance;
}
错误:

[14:17:37 ERROR]: Error occurred while enabling VelocusRings v1.0 (Is it up to date?)
java.lang.NullPointerException: null

at me.redshadus.velocus.RingCreation.CreateLifeRing(RingCreation.java:44) ~[?:?]
at me.redshadus.velocus.Main.onEnable(Main.java:33) ~[?:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]
at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:403) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]
at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugin(CraftServer.java:381) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]
at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugins(CraftServer.java:330) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]
at net.minecraft.server.v1_12_R1.MinecraftServer.t(MinecraftServer.java:422) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]
at net.minecraft.server.v1_12_R1.MinecraftServer.l(MinecraftServer.java:383) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]
at net.minecraft.server.v1_12_R1.MinecraftServer.a(MinecraftServer.java:338) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]
at net.minecraft.server.v1_12_R1.DedicatedServer.init(DedicatedServer.java:272) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]
at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:545) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]
at java.lang.Thread.run(Unknown Source) [?:?]
主线33:

createRing.CreateLifeRing();
第44行:

main.ringHolder.put(loc, starterRing);

控制台还输出:createlifering working

我认为您忘记创建
Main
实例。

问题是您从未初始化
Main
实例:
更改:

这是“延迟加载”单例的典型模式。

您还应该将构造函数设置为私有的
private Main()
,因为我希望只有一个
Main

private Main Main=Main.getInstance();在那一点上(afaik)实例仍然是空的,我决定结束这个问题作为一个重复毕竟,因为它似乎是“另一个NPE”的问题。它没有实质性的区别。看一下评论和答案以获得帮助。它不会起作用。如果我将构造函数设为私有,它会告诉我构造函数不是公共的,因此它不能运行。如果我使用您的方法,它会创建另一个在BukkitAPI中不允许的主实例,因为JavaPlugin只能扩展一次。我忘了在原始问题中添加类级代码。嗯?在Java中,运行程序不需要公共构造函数。My
getInstance
只会在还没有main实例的情况下创建一个实例,并且将构造函数设置为私有将阻止其他任何操作创建另一个实例。听起来像是“Bukkit”试图创建
Main
(如果它需要公共构造函数)的实例,也许你不应该自己创建它。
main.ringHolder.put(loc, starterRing);
public static Main getInstance() {
    return instance;
}
public static Main getInstance() {
    if(instance == null) {
        instance = new Main();
    }
    return instance;
}