简体   繁体   English

Java 插口:三类不合作

[英]Java Spigot: three classes not cooperating

Say I've got three classes: GUI, OpenGui and BanGUIMain.假设我有三个类:GUI、OpenGui 和 BanGUIMain。 GUI:图形用户界面:

public class GUI {

    private BanGUIMain main = new BanGUIMain(); /*line 16*/
    public void createOptionsGUI(Player p) {}
}

OpenGui:开放式:

public class OpenGui implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (sender instanceof Player) {
            if (sender.hasPermission("bangui.opengui")) {
                GUI gui = new GUI(); /*line 14*/
                gui.createOptionsGUI((Player) sender);
            }
        }
        return false;
    }
}

BanGUIMain:班桂主要:

public final class BanGUIMain extends JavaPlugin { /*this is line 12*/
// much stuff that does not matter
}

And well, I am coding a Spigot Plugin.好吧,我正在编写一个 Spigot 插件。 Basically, when I am calling an /opengui command (I registered it), I get this error:基本上,当我调用 /opengui 命令(我注册了它)时,我收到了这个错误:

[16:29:55 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'opengui' in plugin BanGUIMain v1.0.0
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1162) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:997) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [server.jar:git-Spigot-db6de12-18fbb24]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_271]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_271]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [server.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_271]
Caused by: java.lang.IllegalArgumentException: Plugin already initialized!
        at org.bukkit.plugin.java.PluginClassLoader.initialize(PluginClassLoader.java:122) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.java.JavaPlugin.<init>(JavaPlugin.java:66) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at me.roughlyunderscore.plugins.premium.bangui.main.BanGUIMain.<init>(BanGUIMain.java:12) ~[?:?]
        at me.roughlyunderscore.plugins.premium.bangui.main.gui.GUI.<init>(GUI.java:16) ~[?:?]
        at me.roughlyunderscore.plugins.premium.bangui.main.commands.OpenGui.onCommand(OpenGui.java:14) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[server.jar:git-Spigot-db6de12-18fbb24]
        ... 15 more
Caused by: java.lang.IllegalStateException: Initial initialization
        at org.bukkit.plugin.java.PluginClassLoader.initialize(PluginClassLoader.java:125) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.java.JavaPlugin.<init>(JavaPlugin.java:66) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at me.roughlyunderscore.plugins.premium.bangui.main.BanGUIMain.<init>(BanGUIMain.java:12) ~[?:?]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_271]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[?:1.8.0_271]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[?:1.8.0_271]
        at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[?:1.8.0_271]
        at java.lang.Class.newInstance(Unknown Source) ~[?:1.8.0_271]
        at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:76) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:131) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:329) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:251) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugins(CraftServer.java:292) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.init(DedicatedServer.java:198) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:525) ~[server.jar:git-Spigot-db6de12-18fbb24]
        ... 1 more

That's probably what is going on:这可能是正在发生的事情:

  1. Calling opengui command is going to the main class BanGUIMain, where it finds the registered OpenGui.调用 opengui 命令将转到主 class BanGUIMain,它会在其中找到已注册的 OpenGui。
  2. Goes to the OpenGui, where finds the new GUI() line.转到 OpenGui,在那里可以找到新的 GUI() 行。
  3. Goes to the GUI class, where finds the new BanGUIMain() line and probably tries to register the command again or something.转到 GUI class,在那里找到新的 BanGUIMain() 行并可能尝试再次注册命令或其他什么。

    Well, my code doesn't work anyways.好吧,我的代码无论如何都不起作用。 Probably it just loops through all the classes.可能它只是遍历所有类。 But why can't I do that?但为什么我不能这样做? Should I like do an anti-"new GUI()" after finishing using it?我应该在完成使用后做一个反“新GUI()”吗? I am quite new to Java.我对 Java 很陌生。

Upon searching, you probably have the same problem as this .搜索后,您可能遇到与 相同的问题。 In there, it is told to remove the piece of code where it is creating a new instance of the main class.在那里,它被告知删除它正在创建主 class 的新实例的代码。

In your situation, try removing this part in your GUI class:在您的情况下,请尝试在您的 GUI class 中删除此部分:

private BanGUIMain main = new BanGUIMain();

The server is returning the Plugin already initialized!服务器正在返回Plugin already initialized! error because the plugin is loading its main class when the plugin class loader has already loaded it, which is why you should remove the code mentioned above.错误,因为当插件 class 加载程序已经加载它时,插件正在加载它的主要 class,这就是为什么你应该删除上面提到的代码。


Edit:编辑:

If you want to access the methods and variables in the main class, you can do so by declaring a field variable of the main class in your GUI class and assigning or initializing its value at the constructor, like this:如果要访问主 class 中的方法和变量,可以通过在 GUI class 中声明主 class 的字段变量并在构造函数中分配或初始化其值来实现:

public class GUI {

    BanGUIMain plugin;
    
    GUI(BanGUIMain plugin) {
        this.plugin = plugin;
    }
}

Then, if you want to use it in your main class, for example, you would do this:然后,如果你想在你的主 class 中使用它,例如,你可以这样做:

GUI gui = new GUI(this);

But in your code, you used GUI in the OpenGui class, so you would also need to add a constructor in the OpenGui class:但是在您的代码中,您在 OpenGui class 中使用了 GUI,因此您还需要在 OpenGui class 中添加一个构造函数:

public class OpenGui implements CommandExecutor {

    BanGUIMain plugin;

    OpenGui(BanGUIMain plugin) {
        this.plugin = plugin;
    }

    /* few lines skipped */

    GUI gui = new GUI(plugin);

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM