我有一个公开课,在那个课上我有:
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
方法转换为静态方法并通过类而不是实例调用它:
- 在
Msg
类static
中声明log
方法。 - 用
Msg.log("")
代替msg.log("")
调用。 - 去掉
Msg msg = new Msg();
因为它不再需要了。
看一个例子:
class Msg {
public static void log(String msg) {
// ...
}
}
关于java - 不能在 onEnable() 中使用成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7892029/