Проблема с конфигом.

Discussion in 'Разработка плагинов' started by Ravil, 28/4/16.

  1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
Dismiss Notice
We welcome you on our site. This site is devoted to the Nukkit project and all that is connected with him. Here you can communicate, download plugins, also many other things get acquainted! Register the account right now :3
  1. Ravil

    Ravil Pioneer

    Messages:
    18
    Likes Received:
    3
    Minecraft:
    ZloyNick
    Доброго времени суток! Не знаем, как пофиксить ошибку. Вообщем, после обновления сборки с 299 до 304 один из плагинов перестал работать.
    Ругается на строку Config config = new Config(file, 2). В консоль дебажит:

    at cn.nukkit.utils.ConfigSection.<init>(ConfigSection.java:35)
    at cn.nukkit.utils.Config.parseContent(Config.java:539)
    at cn.nukkit.utils.Config.load(Config.java:157)
    at cn.nukkit.utils.Config.<init>(Config.java:99)
    at cn.nukkit.utils.Config.<init>(Config.java:90)
    at ru.detreex.simplecommands.utils.YMLprovider.save(YMLprovider.java:26)
    at ru.detreex.simplecommands.SimpleCommands.onEnable(SimpleCommands.java:428)
    at cn.nukkit.plugin.PluginBase.setEnabled(PluginBase.java:89)
    at cn.nukkit.plugin.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:117)
    at cn.nukkit.plugin.PluginManager.enablePlugin(PluginManager.java:452)
    at cn.nukkit.Server.enablePlugin(Server.java:605)
    at cn.nukkit.Server.enablePlugins(Server.java:594)
    at cn.nukkit.Server.<init>(Server.java:441)
    at cn.nukkit.Nukkit.main(Nukkit.java:65)

    Пожалуйста, помогите исправить!
     
    Last edited: 28/4/16
  2. fromgate

    fromgate Administrator

    Messages:
    668
    Likes Received:
    187
    А как без кода-то исправить? ;)
    Что тут: ru.detreex.simplecommands.utils.YMLprovider.save (строка 26 и вокруг неё)?
     
  3. Ravil

    Ravil Pioneer

    Messages:
    18
    Likes Received:
    3
    Minecraft:
    ZloyNick
    Извиняюсь.

    package ru.detreex.simplecommands.utils;
    import cn.nukkit.utils.Config;
    import java.io.File;
    import java.lang.annotation.Annotation;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    public abstract class YMLprovider {
    public boolean save(File file) {
    file.getParentFile().mkdirs();
    try {
    if (file.exists()) {
    file.delete();
    }
    file.createNewFile();
    }
    catch (Exception var2_2) {
    var2_2.printStackTrace();
    return false;
    }
    Config config = new Config(file, 2);
    for (Field field : this.getClass().getDeclaredFields()) {
    String string = this.getPath(field);
    try {
    config.set(string, field.get(this));
    continue;
    }
    catch (IllegalAccessException var8_9) {
    var8_9.printStackTrace();
    return false;
    }
    }
    config.save();
    return true;
    }
    public boolean load(File file) {
    file.getParentFile().mkdirs();
    try {
    if (!file.exists()) {
    file.createNewFile();
    }
    }
    catch (Exception var2_2) {
    var2_2.printStackTrace();
    return false;
    }
    Config config = new Config(file, 2);
    for (Field field : this.getClass().getDeclaredFields()) {
    String string = this.getPath(field);
    try {
    if (field.getType() == Integer.TYPE || field.getType() == Integer.class) {
    field.set(this, config.getInt(string, field.getInt(this)));
    continue;
    }
    if (field.getType() == Boolean.TYPE || field.getType() == Boolean.class) {
    field.set(this, config.getBoolean(string, field.getBoolean(this)));
    continue;
    }
    if (field.getType() == String.class) {
    field.set(this, config.getString(string, (String)field.get(this)));
    continue;
    }
    throw new UnsupportedClassVersionError("YamlConfig did not supports this class: " + field.getType().getName());
    }
    catch (Exception var8_9) {
    var89.printStackTrace();
    return false;
    }
    }
    return false;
    }
    private String getPath(Field field) {
    String string = null;
    if (field.isAnnotationPresent(Path.class)) {
    Path path = (Path)field.getAnnotation(Path.class);
    string = path.value();
    }
    if (string == null || string.isEmpty()) {
    field.getName().replaceAll("
    ", ".");
    }
    if (Modifier.isPrivate(field.getModifiers())) {
    field.setAccessible(true);
    }
    return string;
    }
    @Retention(value=RetentionPolicy.RUNTIME)
    @Target(value={ElementType.FIELD})
    public static @interface Path {
    public String value() default "";
    }
    }
     
  4. fromgate

    fromgate Administrator

    Messages:
    668
    Likes Received:
    187
    А сама ошибка какая? Всю целиком скопируй пожалуйста
     
  5. Ravil

    Ravil Pioneer

    Messages:
    18
    Likes Received:
    3
    Minecraft:
    ZloyNick
    20:03:12 [INFO] Включение DTXapi v15
    20:03:12 [ALERT] java.lang.NullPointerException
    at cn.nukkit.utils.ConfigSection.<init>(ConfigSection.java:35)
    at cn.nukkit.utils.Config.parseContent(Config.java:539)
    at cn.nukkit.utils.Config.load(Config.java:157)
    at cn.nukkit.utils.Config.<init>(Config.java:99)
    at cn.nukkit.utils.Config.<init>(Config.java:86)
    at cn.nukkit.utils.Config.<init>(Config.java:82)
    at cn.nukkit.plugin.PluginBase.reloadConfig(PluginBase.java:239)
    at cn.nukkit.plugin.PluginBase.getConfig(PluginBase.java:218)
    at ru.detreex.simplecommands.SimpleCommands.onEnable(SimpleCommands.java:469)
    at cn.nukkit.plugin.PluginBase.setEnabled(PluginBase.java:89)
    at cn.nukkit.plugin.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:117)
    at cn.nukkit.plugin.PluginManager.enablePlugin(PluginManager.java:452)
    at cn.nukkit.Server.enablePlugin(Server.java:605)
    at cn.nukkit.Server.enablePlugins(Server.java:594)
    at cn.nukkit.Server.<init>(Server.java:441)
    at cn.nukkit.Nukkit.main(Nukkit.java:65)
    20:03:12 [INFO] Выключение DTXapi v15
     
  6. fromgate

    fromgate Administrator

    Messages:
    668
    Likes Received:
    187
    java.lang.NullPointerException
    Это означает, что какой-то объект, к которому происходит обращение - это Null.

    Смотрим 82-ую строчку класса Config: https://github.com/Nukkit/Nukkit/blob/master/src/main/java/cn/nukkit/utils/Config.java#L82

    Спорим, у Вас не проинициализирован файл? ;) В смысле объект файл, который вы указываете в конструкторе - это null.

    Что тут: SimpleCommands.java:469 ?
     
  7. fromgate

    fromgate Administrator

    Messages:
    668
    Likes Received:
    187
    Если нужно создать объект конфигурации без привязки к файлу, то сейчас можно сделать просто:
    Config cfg = new Config (Config.YAML);
    или даже
    Config cfg = new Config ();
     
  8. fromgate

    fromgate Administrator

    Messages:
    668
    Likes Received:
    187
    Но это уже другая ошибка.
    В преыдущей ноги растут откуда-то из другого места.

    at cn.nukkit.utils.ConfigSection.<init>(ConfigSection.java:35) — это уже из нового. Вот тут хотелось бы понять причину.

    Но для этого мне нужно понимать, что конкретно в этой строке: at ru.detreex.simplecommands.utils.YMLprovider.save(YMLprovider.java:26) тот код, что Вы привели - похож на декомпилированный. И строки там могут быть совсем другими.
     
  9. Ravil

    Ravil Pioneer

    Messages:
    18
    Likes Received:
    3
    Minecraft:
    ZloyNick
    "Переменная file задаётся функцией. Если сделать так, как предлагают, то авторизация не будет работать." - так мне сказал тот, кто писал плагин.
     
  10. Ravil

    Ravil Pioneer

    Messages:
    18
    Likes Received:
    3
    Minecraft:
    ZloyNick
    До сборки 301 было нормально
     
  11. fromgate

    fromgate Administrator

    Messages:
    668
    Likes Received:
    187
    Вот нужно эту функцию проверять - она в переменную file засунула null. Вместо файла.
     
  12. Ravil

    Ravil Pioneer

    Messages:
    18
    Likes Received:
    3
    Minecraft:
    ZloyNick
    А может, проблема этой ошибки и вовсе, в ядре?
     
    fromgate likes this.
  13. fromgate

    fromgate Administrator

    Messages:
    668
    Likes Received:
    187
    Для этого я пытаюсь добиться кода, который приводит к ошибке. А Вы даже ошибки целиком не привели.
    Мне нужно больше информации, чтобы попытаться вопроизвести ситуацию.
    Если что-то неучтено в ConfigSection — значит я буду вносить изменение. Если же что-то в коде плагина, то извините ;)

    Вот к примеру, фрагмент плагина, который я специально написал для проверки конфигуратора: всё работает нормально.

    Code:
    @Override
    public void onEnable(){
    this.getDataFolder().mkdirs();
    this.getLogger().info("1: "+this.getConfig().getInt("int-test",0));
    this.getConfig().set("int-test",this.getConfig().getInt("int-test",0)+1);
    this.getLogger().info("2: "+this.getConfig().getInt("int-test",0));
    this.saveConfig();
    for (String key : getConfig().getKeys(true))
    this.getLogger().info(TextFormat.GOLD+key+" : "+getConfig().get(key));
    ConfigSection section = this.getConfig().getSections("aaa");
    this.getLogger().info(section.toString());
    
    [pre][code]    Config cfg = new Config();
        cfg.set("aaaa","test");
        cfg.set("bbbb","test");
        cfg.save(new File(this.getDataFolder(),"test-aaaa.cfg"));
        cfg.remove("aaaa");
        cfg.save();
    
        File f = new File(this.getDataFolder(),"test-bbb.cfg");
        Config cfg2 = new Config(f,Config.YAML);
        cfg2.set("aaaaa.aaaaa",100);
        cfg2.save();
    [/pre]
    [/code]
     
  14. Ravil

    Ravil Pioneer

    Messages:
    18
    Likes Received:
    3
    Minecraft:
    ZloyNick
    Я скинул всё, что вылезло в консоли, скинул код. Разве этого недостаточно?
     
    fromgate likes this.
  15. fromgate

    fromgate Administrator

    Messages:
    668
    Likes Received:
    187
    В первом сообщении нет самой ошибки. Она может быть любой.
    Код - это декомпиляция, а не исходный. Поэтому какая строка в этом коде соответствует YMLprovider.java:26 — непонятно.
     
  16. fromgate

    fromgate Administrator

    Messages:
    668
    Likes Received:
    187
    @Ravil

    Всё разоборались. Действительно, у меня был недочёт в конструкторе ConfigSection.

    Исправление внесли: https://github.com/Nukkit/Nukkit/pull/733
    В следующем билде будет всё нормально :)
     
    M4Gn1T likes this.

Share This Page