Помогите NullPointerException у переменной

Статус
Закрыто для дальнейших ответов.

SintezGames

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
EstrangedFury
Stacktrace:
Код:
[20:53:30] [Server thread/INFO]: [AdvancedDuels] Enabling AdvancedDuels v1.0
[20:53:30] [Server thread/ERROR]: Error occurred while enabling AdvancedDuels v1.0 (Is it up to date?)
java.lang.NullPointerException: null
    at md.sintez.advancedDuels.commands.CreateArenaCommand.<init>(CreateArenaCommand.java:19) ~[?:?]
    at md.sintez.advancedDuels.MainClass.registerCommands(MainClass.java:34) ~[?:?]
    at md.sintez.advancedDuels.MainClass.onEnable(MainClass.java:18) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[spigot.jar:git-Spigot-dcd1643-e60fc34]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337) [spigot.jar:git-Spigot-dcd1643-e60fc34]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:403) [spigot.jar:git-Spigot-dcd1643-e60fc34]
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugin(CraftServer.java:381) [spigot.jar:git-Spigot-dcd1643-e60fc34]
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugins(CraftServer.java:330) [spigot.jar:git-Spigot-dcd1643-e60fc34]
    at net.minecraft.server.v1_12_R1.MinecraftServer.t(MinecraftServer.java:422) [spigot.jar:git-Spigot-dcd1643-e60fc34]
    at net.minecraft.server.v1_12_R1.MinecraftServer.l(MinecraftServer.java:383) [spigot.jar:git-Spigot-dcd1643-e60fc34]
    at net.minecraft.server.v1_12_R1.MinecraftServer.a(MinecraftServer.java:338) [spigot.jar:git-Spigot-dcd1643-e60fc34]
    at net.minecraft.server.v1_12_R1.DedicatedServer.init(DedicatedServer.java:272) [spigot.jar:git-Spigot-dcd1643-e60fc34]
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:545) [spigot.jar:git-Spigot-dcd1643-e60fc34]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_231]

Строки из stacktrace'а:

MainClass.java (34 строка):
Код:
new CreateArenaCommand();

MainClass.java (18 строка):
Код:
registerCommands();

Метод registerCommands():
Код:
private void registerCommands() {
    new CreateArenaCommand();
    new SetArenaSpawnCommand();
    new FinishArenaCommand();
}

CreateArenaCommand.java (19 строка) (переменная PLUGIN статичная, этот код находится в конструкторе класса CreateArenaCommand):
Код:
PLUGIN.getCommand(command).setExecutor(this);
 
Спасибо, очень помог (нет). В этих Java-док-ах я ничего нового не узнал. Мне нужно понять не причину NPE, а причину null. Если ты пришел меня обосрать, как остальных, то не пиши ничего лучше, я дождусь нормальной помощи.
 
Спасибо, очень помог (нет). Если ты пришел меня обосрать, как остальных, то не пиши ничего лучше, я дождусь нормальной помощи.
Окай скажу своими словами на русском, вызывается когда объект null. Если твоих познаний не хватило понять на инглише.
 
Сходи еще раз перечитай когда NullPointerException выбрасывется. К чему спорить то?
Я понимаю, почему возникает NPE, но почему мое значение null. Вот мой вопрос. Я это значение получаю через статичную переменную, присваиваю ей значение при включении плагина, через статичный метод получаю ее значение в другом классе (getter) - NPE.
 
И то что переменная статична, не значит, что она сама по волшебству назначается.
MainClass:
Код:
public class MainClass extends JavaPlugin {
    
    private static MainClass INSTANCE;
    
    @Override
    public void onEnable() {
        INSTANCE = this;
        loadConfig();
        registerCommands();
    }
}

CreateArenaCommand:
Код:
    private static MainClass PLUGIN = MainClass.getInstance();
    
    public CreateArenaCommand() {
        PLUGIN.getCommand(command).setExecutor(this);
    }
 
MainClass:
Код:
public class MainClass extends JavaPlugin {
  
    private static MainClass INSTANCE;
  
    @Override
    public void onEnable() {
        INSTANCE = this;
        loadConfig();
        registerCommands();
    }
}

CreateArenaCommand:
Код:
    private static MainClass PLUGIN = MainClass.getInstance();
  
    public CreateArenaCommand() {
        PLUGIN.getCommand(command).setExecutor(this);
    }
Зачем назначать статичную переменную PLUGIN которая берет значение другой статичной переменной главного класса плагина?
Не проще в этом случае использовать прямо MainClass.getInstance()?
MainClass.getInstance().getCommand(command).setExecutor(this);
 
Чем гадать, просто глянь номер строки где ошибка и там увидешь какая переменная нул.
 
Зачем назначать статичную переменную PLUGIN которая берет значение другой статичной переменной главного класса плагина?
Не проще в этом случае использовать прямо MainClass.getInstance()?
MainClass.getInstance().getCommand(command).setExecutor(this);
Согласен, еврей тот еще. Когда можно вот так
this.getCommand(command).setExecutor(new CreateArenaCommand(this));
Но это к сути не относится. Это уже не умение работать с ооп.
 
Чем гадать, просто глянь номер строки где ошибка и там увидешь какая переменная нул.
Я знаю, что именно null, но я не знаю, почему.

Зачем назначать статичную переменную PLUGIN которая берет значение другой статичной переменной главного класса плагина?
Не проще в этом случае использовать прямо MainClass.getInstance()?
MainClass.getInstance().getCommand(command).setExecutor(this);
Согласен, еврей тот еще. Когда можно вот так
this.getCommand(command).setExecutor(new CreateArenaCommand(this));
Но это к сути не относится. Это уже не умение работать с ооп.
Исправил.
 
NPE ты схватываешь из-за того что назначаешь переменную PLUGIN быстрее чем instance у MainClass подгружается.
Понял, спасибо. Можешь, пожалуйста, подсказать, как это исправить?
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх