Katakanlah saya punya tiga kelas: GUI, OpenGui dan 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
}

Dan yah, saya mengkodekan Plugin Spigot. Pada dasarnya, ketika saya memanggil perintah /opengui (saya mendaftarkannya), saya mendapatkan kesalahan ini:

[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

Itu mungkin yang sedang terjadi:

  1. Memanggil perintah opengui akan menuju ke kelas utama BanGUIMain, di mana ia menemukan OpenGui yang terdaftar.
  2. Pergi ke OpenGui, di mana menemukan baris GUI() baru.
  3. Pergi ke kelas GUI, di mana menemukan baris BanGUIMain() baru dan mungkin mencoba mendaftarkan perintah lagi atau sesuatu.

    Yah, kode saya tidak berfungsi. Mungkin itu hanya loop melalui semua kelas. Tapi kenapa aku tidak bisa melakukannya? Haruskah saya melakukan anti-"GUI baru ()" setelah selesai menggunakannya? Saya cukup baru di Jawa.
-2
LeopardL GD 9 Mei 2021, 14:41

1 menjawab

Jawaban Terbaik

Saat menelusuri, Anda mungkin memiliki masalah yang sama dengan ini. Di sana, diperintahkan untuk menghapus potongan kode di mana ia membuat instance baru dari kelas utama.

Dalam situasi Anda, coba hapus bagian ini di kelas GUI Anda:

private BanGUIMain main = new BanGUIMain();

Server mengembalikan kesalahan Plugin already initialized! karena plugin sedang memuat kelas utamanya ketika pemuat kelas plugin telah memuatnya, itulah sebabnya Anda harus menghapus kode yang disebutkan di atas.


Sunting:

Jika Anda ingin mengakses metode dan variabel di kelas utama, Anda dapat melakukannya dengan mendeklarasikan variabel bidang kelas utama di kelas GUI Anda dan menetapkan atau menginisialisasi nilainya di konstruktor, seperti ini:

public class GUI {

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

Kemudian, jika Anda ingin menggunakannya di kelas utama Anda, misalnya, Anda akan melakukan ini:

GUI gui = new GUI(this);

Tetapi dalam kode Anda, Anda menggunakan GUI di kelas OpenGui, jadi Anda juga perlu menambahkan konstruktor di kelas OpenGui:

public class OpenGui implements CommandExecutor {

    BanGUIMain plugin;

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

    /* few lines skipped */

    GUI gui = new GUI(plugin);

}
1
Lloyd Dominic 12 Mei 2021, 02:18