有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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");
    }

}

共 (3) 个答案

  1. # 1 楼答案

    只需使用:

    getLogger().info("Talliban bajs i simskolans sovrum!!!!");
    
  2. # 2 楼答案

    logmsg都是对象,在Msg类上没有log方法,所以msg.log将不起作用。 您可以从msg对象调用Msg的公共方法,但不能调用您创建的对象

  3. # 3 楼答案

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

    为了说明上述情况,可以例如声明msg{}:

    private final Msg msg = new Msg();
    

    “就地”创建新实例也是安全的(这就是为什么在测试时它能工作的原因):

    new Msg().log("");
    

    就我所见,上面的代码也会使msg中的Chat成员变得多余,这样您就可以简单地删除它

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

    1. Msgstatic中声明log方法
    2. Msg.log("")而不是msg.log("")调用
    3. 摆脱Msg msg = new Msg();,因为它不再需要了

    请看一个例子:

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