gpt4 book ai didi

java - 不能在 onEnable() 中使用成员变量

转载 作者:行者123 更新时间:2023-11-29 08:11:32 25 4
gpt4 key购买 nike

我有一个公开课,在那个课上我有:

Msg msg = new Msg();

但是我无法从类的 public void 方法访问 msg

如果我:

  • 每次使用时,将 Msg msg = new Msg(); 放在 msg 之前。
  • 改为执行 new Msg().log("")

如果我尝试它不起作用:

private static Msg msg = new Msg();
public static Msg msg = new Msg();

我在控制台中得到的错误是:

java.lang.NoClassDefFoundError: enji/lep/Msg at enji.lep.chat.Chat.<init>(Chat.java:16)

相关代码如下:

import java.util.logging.Logger;

import org.bukkit.plugin.java.JavaPlugin;

/* Created by enji */

public class Chat extends JavaPlugin {

Logger log = Logger.getLogger("Minecraft");
Msg msg = new Msg();

@Override
public void onEnable() {
msg.log("Talliban bajs i simskolans sovrum!!!!"); // This causes the error
}

@Override
public void onDisable() {
log.info("Plugin off");
}

}

最佳答案

您的代码不是线程安全的。奇怪data race如果 Chat 对象在一个线程中创建(并且其成员 msg 分别被初始化)是可能的,但是方法 Chat#onEnable() (其中使用那个 msg 成员)从另一个线程调用。

考虑到上述情况,例如可以声明msg final:

private final Msg msg = new Msg();

“就地”创建新实例也是安全的(这就是它在您测试时起作用的原因):

new Msg().log("");

据我所知,上面的内容也会使 Chat 中的 msg 成员变得多余,因此您可以简单地删除它。

另一种选择是将 Msg.log 方法转换为静态方法并通过类而不是实例调用它:

  1. Msgstatic 中声明 log 方法。
  2. Msg.log("") 代替 msg.log("") 调用。
  3. 去掉 Msg msg = new Msg(); 因为它不再需要了。

看一个例子:

class Msg {
public static void log(String msg) {
// ...
}
}

关于java - 不能在 onEnable() 中使用成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7892029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com