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

Minecraft Paper Kotlin插件:添加值后HashMap为何为空?

问题分析

你遇到的核心问题是:处理onInventoryClick事件的FishMatch实例,和调用play()方法的FishMatch实例不是同一个对象。这会导致两个实例各自持有独立的players HashMap,事件触发时访问的自然是空的那一份。

常见原因&解决方案

1. 重复创建FishMatch实例

如果调用play()时每次都新建FishMatch对象(比如写FishMatch(plugin).play(player)),同时又在其他地方注册了另一个FishMatch实例作为Listener,就会出现这种数据不互通的情况。

解决方法:使用单例实例

在插件主类中创建唯一的FishMatch实例,注册为Listener,所有调用play()的地方都复用这个实例:

// 插件主类
class MyPlugin : JavaPlugin() {
    lateinit var fishMatch: FishMatch

    override fun onEnable() {
        fishMatch = FishMatch(this)
        server.pluginManager.registerEvents(fishMatch, this)
    }
}

// 调用play的地方(比如命令处理器)
fun someCommand(player: Player) {
    val plugin = player.plugin as MyPlugin
    plugin.fishMatch.play(player)
}

2. 事件注册错误

如果FishMatch的Listener是在play()方法这类动态逻辑中注册的,可能会导致注册多个实例,或者注册的实例和调用play()的不是同一个。

解决方法:统一在插件主类注册Listener

确保只有一个FishMatch实例被注册为Listener,且这个实例就是你用来调用play()的那个。

3. 快速验证手段

在play()和onInventoryClick方法中分别打印实例的hashCode(),就能确认是否是同一个对象:

fun play(player: Player) {
    // ...
    Messages().log(plugin, "FishMatch实例哈希: ${this.hashCode()}")
}

@EventHandler
fun onInventoryClick(event: InventoryClickEvent) {
    // ...
    Messages().log(plugin, "FishMatch实例哈希: ${this.hashCode()}")
}

如果两个哈希值不同,就可以确定是多实例导致的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:02:21