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
相关产品推荐
相关产品推荐

