java无法在onEnable()中使用成员变量
我有一个公共课程,在该课程中我有:
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");
}
}
# 1 楼答案
只需使用:
# 2 楼答案
log
和msg
都是对象,在Msg
类上没有log
方法,所以msg.log
将不起作用。 您可以从msg
对象调用Msg
的公共方法,但不能调用您创建的对象# 3 楼答案
你的代码不是线程安全的。 如果在一个线程中创建了
Chat
对象(并分别初始化了其成员msg
),但从另一个线程调用了方法Chat#onEnable()
(使用该msg
成员),则可能出现奇怪的data race为了说明上述情况,可以例如声明}:
msg
{“就地”创建新实例也是安全的(这就是为什么在测试时它能工作的原因):
就我所见,上面的代码也会使
msg
中的Chat
成员变得多余,这样您就可以简单地删除它另一个选项是将
Msg.log
方法转换为静态方法,并通过类而不是实例调用它:Msg
类static
中声明log
方法李>Msg.log("")
而不是msg.log("")
调用李>Msg msg = new Msg();
,因为它不再需要了李>请看一个例子: