You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Minecraft Kotlin插件启用报ExceptionInInitializerError错误求助

错误原因

核心错误是你在Variables单例对象中手动实例化了Main插件类:

// 错误代码
private val plugin: JavaPlugin = Main()

Bukkit服务端加载插件时会自动通过反射创建唯一的插件主类实例,禁止开发者手动实例化JavaPlugin的子类,你这里手动创建了Main()实例就触发了Plugin already initialized异常。且因为Variables是单例,第一次被访问时(即你调用loadConfig()访问Variables.file的时候)会初始化这个错误的Main实例,刚好对应你报错的调用栈位置。

修复方案

1. 调整Variables类的实现

移除手动实例化Main的代码,将插件实例改为延后赋值,同时优化配置文件路径逻辑:

import org.bukkit.configuration.file.YamlConfiguration
import org.bukkit.plugin.java.JavaPlugin
import java.io.File
import java.util.UUID

object Variables {
    // 删掉原有手动初始化的plugin,改为延后赋值
    lateinit var plugin: JavaPlugin
    var moneyMap: MutableMap<UUID?, Int?> = mutableMapOf(null to null)
    var joinMap: MutableMap<UUID?, Int?> = mutableMapOf(null to null)
    // 用插件内置的数据文件夹方法生成路径,兼容性更强
    val file: File 
        get() = File(plugin.dataFolder, "config.yml")
    var cfile: YamlConfiguration? = null
}

2. 在主类onEnable中初始化插件实例

服务端自动创建的主类实例才是合法实例,在这里赋值给Variables:

class Main : JavaPlugin() {
    override fun onEnable() {
        logger.info("Enabling...")
        // 先给Variables的plugin赋值,再调用loadConfig
        Variables.plugin = this
        loadConfig()
        // 原有逻辑保持不变
        getCommand("sell")?.apply {
            setExecutor(WAGcommand(this@Main))
            tabCompleter = WAGcommand(this@Main)
        }
        server.pluginManager.registerEvents(Listeners(), this)
    }

    override fun onDisable() {
        logger.info("Disabling...")
    }
}

3. 可选优化loadConfig逻辑

如果你的插件资源目录中已经内置了默认config.yml,可以直接用Bukkit封装好的配置加载方法,不用自己写读写逻辑:

fun loadConfig() {
    val plugin = Variables.plugin
    // 不存在配置文件时自动将资源内的默认配置写出到文件
    plugin.saveDefaultConfig()
    Variables.cfile = plugin.config
}

内容的提问来源于stack exchange,提问作者buudd1234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:06:03