Bukkit对主类的静态引用

J22929

我正在制作一个bukkit插件,并且正在使用config.yml并具有一个布尔值来访问该配置,但是由于我是在另一个类中引用它的,因此它必须是静态的,我认为这会导致其中断。不知道如何解决。

错误讯息:

            at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:673) [craftbukkit-1.8.8.jar:git-Bukkit-efe04b8]
               net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:335) [craftbukkit-1.8.8.jar:git-Bukkit-efe04b8]
               net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:629) [craftbukkit-1.8.8.jar:git-Bukkit-efe04b8]
               net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:537) [craftbukkit-1.8.8.jar:git-Bukkit-efe04b8]
7:28:03 AM  at java.lang.Thread.run(Thread.java:745) [?:1.8.0_65]
7:28:03 AM Caused by: java.lang.NullPointerException
7:28:03 AM  at otherResources.PermissionHandler.getPerm(PermissionHandler.java:16) ~[?:?]
7:28:03 AM  at main.Main.onCommand(Main.java:33) ~[?:?]
7:28:03 AM  at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[craftbukkit-1.8.8.jar:git-Bukkit-efe04b8]

编码:

package main;

import java.util.Arrays;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

import otherResources.PermissionHandler;

    public class Main extends JavaPlugin{
        public void onEnable(){
            new PermissionHandler(this);
            getLogger().info("Green lantern class is now active.");
            this.getConfig().addDefault("permsgl", "");
            this.getConfig().options().copyDefaults(true);
            saveConfig();
        }
        public void onDisable(){
            getLogger().info("Green lantern class is not active.");
            saveConfig();
        }
        @SuppressWarnings("deprecation")
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
            Player p = (Player) sender;

            if(cmd.getName().equalsIgnoreCase("pring") && otherResources.PermissionHandler.getPerm(p)){
                ItemStack PowerRing = new ItemStack(Material.SLIME_BALL);
                ItemMeta PowerRingMeta = PowerRing.getItemMeta();
                PowerRingMeta.setDisplayName(ChatColor.GREEN + "Power Ring");
                PowerRingMeta.setLore(Arrays.asList(ChatColor.DARK_GREEN + "Mode: Laser"));
                    p.getInventory().addItem(PowerRing);
                    Bukkit.broadcastMessage("Spawn Ring is in Order");
                    return true;
            }
            if(cmd.getName().equalsIgnoreCase("gladd") && (p.isOp())){
                Player t = Bukkit.getServer().getPlayer(args[1]);
                otherResources.PermissionHandler.givePerm(t);
                Bukkit.broadcastMessage("Spawn Ring is in Order");
                if(!t.isOnline()){
                    p.sendMessage(ChatColor.RED + "ERROR! " + ChatColor.YELLOW + args[1] + " is either offline or does not exist." );
                    return true;
                }
            }
            else{
            return true;
            }
            return true;
        }

        }
G.梅

如果您查看错误消息:

7:28:03 AM Caused by: java.lang.NullPointerException
7:28:03 AM  at otherResources.PermissionHandler.getPerm(PermissionHandler.java:16) ~[?:?]
7:28:03 AM  at main.Main.onCommand(Main.java:33) ~[?:?]
7:28:03 AM  at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[craftbukkit-1.8.8.jar:git-Bukkit-efe04b8]

在您的代码中,您正在调用对象上的某些对象 null

它发生在这里:

otherResources.PermissionHandler.getPerm(p) // line 33

因为您是getPerm像您所说的那样静态调用的,并且:

为此,您可以在构造函数中分配主变量(帖子已编辑,因此删除了第二个类):

public PermissionHandler(Main plugin) {
    configGetter = plugin; // Assigning inside constructor
}

但是,当您创建对象时,不要使用变量:

public void onEnable(){
    new PermissionHandler(this); // You create it, but don't assign it to a value, or use the value
}

因此,您正在创建对象实例,但未使用它,而是在调用静态方法,这意味着它不了解变量。


在解决问题方面:

但是由于我是在另一个类中引用它,所以它必须是静态的,我认为这会导致它中断。不知道如何解决。

最简单的解决方案是使用Singleton设计模式它允许您创建一个对象的单个实例(因此可以让您分配该Main变量),同时提供对该对象的全局引用(即,您可以像使用静态变量一样使用它)。我建议阅读一下。

其他解决方案:

  1. 使用静态方法初始化Main变量
  2. 重构插件结构以消除静态需求

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

类对象的静态引用

来自分类Dev

在Typescript中引用静态类

来自分类Dev

如何从主类调用非静态方法

来自分类Dev

从外部类引用静态嵌套类对象

来自分类Dev

如何从Python类中引用静态属性?

来自分类Dev

如何从XAML引用静态类字段

来自分类Dev

使用无引用的NON静态类方法

来自分类Dev

通过引用类避免访问静态字段?

来自分类Dev

如何从类变量引用静态方法

来自分类Dev

打字稿:自引用静态类成员

来自分类Dev

传递对C#静态类的引用

来自分类Dev

别名本身中的完全静态类的引用

来自分类Dev

在Android的静态类中引用非静态方法-getSharedPref

来自分类Dev

带有静态引用的静态类初始化

来自分类Dev

如何在类静态成员中引用静态变量?

来自分类Dev

JavaFx:如何从CustomComponentController类引用主Controller类实例?

来自分类Dev

是否可以在静态类中引用方法而不引用该类?

来自分类Dev

静态类成员/类引用的生命周期?

来自分类Dev

从抽象类的静态方法返回类引用

来自分类Dev

静态方法不在主类中运行它

来自分类Dev

TypeScript:继承类中静态方法的自引用返回类型

来自分类Dev

带有静态方法的Python类并引用self

来自分类Dev

动态加载类可以重新绑定到静态引用吗?

来自分类Dev

对静态库中的类变量的未定义引用

来自分类Dev

为什么引用静态final字段不会触发类加载?

来自分类Dev

使用静态变量在Objective C中引用类的实例?

来自分类Dev

在Java中,如何显式引用“ this”类的静态成员?

来自分类Dev

如何在静态类方法中引用提供者?

来自分类Dev

如何从父类构造函数引用重写的静态方法?

Related 相关文章

热门标签

归档