1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите NullPointerException на ровном месте

Тема в разделе "Разработка плагинов для новичков", создана пользователем Bars, 19 фев 2015.

Статус темы:
Закрыта.
  1. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Получаю ShaftWars.destinationWorld из класса Messenger:
    Код:
            if (ShaftWars.destinationWorld == null) Bukkit.getLogger().info("ShaftWars.destinationWorld == null");
            else Bukkit.getLogger().info("ShaftWars.destinationWorld.getName() == "+ShaftWars.destinationWorld.getName());
            if (ShaftWars.destinationWorld.getPlayers() == null) Bukkit.getLogger().info("ShaftWars.destinationWorld.getPlayers() == null");
            else Bukkit.getLogger().info("ShaftWars.destinationWorld.getPlayers() != null");
          List<Player> var7 = (List<Player>)ShaftWars.destinationWorld.getPlayers();
    
    В консоли получаю
    В главном классе ShaftWars следующее:

    Код:
    public static World mineWorld;
    public static World destinationWorld;
    
    
    
    public void onEnable() {
      mineWorld = getServer().getWorld(config.mineWorld);
      destinationWorld = mineWorld;
      if (mineWorld == null) getServer().broadcastMessage("MAIN: [ON START] mineWorld == null"); // Не выводится, значит mineWorld не null
    
      if (destinationWorld == null) getServer().broadcastMessage("MAIN: [ON START] destinationWorld == null"); // Не выводится, значит destinationWorld не null
    
      messenger = new Messenger(this, config, pressurePlateBlock.getLocation());
    
    }
    //...
    messenger.msgNear("моё сообщение");
    PS: "моё сообщение" в игре выводится, но с null нужно разобраться
     
  2. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    (Messenger.java:47)
     
  3. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    А остальной код я просто так приложил? Нет, а значит он несёт весомую смысловую нагрузку сообщения
    И ниже указаны строки из того класса
     
  4. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Ну, приложил не приложил, я же не вижу твой исходник так, чтобы видеть в нём номера строк.
    Какая из них есть 47я?
     
  5. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    why (ShaftWars.destinationWorld == null), if (переменная проинициализирована и не равна null в реале, что было проверено сразу же после этой инициализации)?
    Первое сообщение перед краш–логом вывело
    За это отвечает строчка 1 из 5, а следующая (2 из 5) — это 47–я
    Ой, то есть 5 из 5. Если первые 4 строчки это логгер (отладка) и судя по консоли она работает, то я бы наверное догадался, что последняя и есть 47–я. Ладно, наверное я просто не умею излагать суть
     
  6. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Ты сначала проверяешь destinationWorld на null, логируешь это, а потом тут же используешь этот destinationWorld.
     
  7. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Тут скорее проблема в том, почему destinationWorld null
     
  8. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Именно так. Потому что я после инициализации проверял на null и результат отрицательный, переменная проинициализирована (см. комментарии к коду):
     
  9. ensirius

    ensirius Старожил Пользователь

    Баллы:
    123
    А можно полный код класса?
     
  10. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    http://pastebin.com/uRfgKN2c
     
  11. ensirius

    ensirius Старожил Пользователь

    Баллы:
    123
    У вас ошибка здесь - at ru.onlymc.shaftwars.Messenger.msgNear(Messenger.java:47). Вот этот класс и покажите. Из этого станет понятно что именно проблемит у вас. И я могу ошибаться, но это возвращает не блок под игроком:

    Код:
    if(!pressurePlateBlockRelatives.contains(player.getLocation().getBlock())){
    А поскольку игрок не может находиться в блоках, блок NULL.
     
    Последнее редактирование: 20 фев 2015
  12. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    @ensirius,
    Код:
    List<Player> var7 = (List<Player>)ShaftWars.destinationWorld.getPlayers();
    Это, конечно, 49-я строка, но до строчек отладки она была 47-й (с той же ошибкой)
    Вот, 47-я сейчас на третьей строчке:
    Код:
            if (ShaftWars.destinationWorld == null) Bukkit.getLogger().info("ShaftWars.destinationWorld == null");
            else Bukkit.getLogger().info("ShaftWars.destinationWorld.getName() == "+ShaftWars.destinationWorld.getName());
            if (ShaftWars.destinationWorld.getPlayers() == null) Bukkit.getLogger().info("ShaftWars.destinationWorld.getPlayers() == null");
            else Bukkit.getLogger().info("ShaftWars.destinationWorld.getPlayers() != null");
          List<Player> var7 = (List<Player>)ShaftWars.destinationWorld.getPlayers();
     
  13. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Может: в воде, на плитах, цветах и тп.
     
  14. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Ошибаетесь, иначе сообщения вывелись бы в консоль:
    Код:
    log.debug("Player block position: " + block.getX() + "," + block.getY() + "," + block.getZ());
    log.debug("PressurePlateBlockPosition: " + pressurePlateBlock.getX() + "," + pressurePlateBlock.getY() + "," + pressurePlateBlock.getZ());

    Тем более там идёт проверка не только самого блока, но и его сторон, поэтому плиты работают норм
    Перепроверили, ошибка на 49-й, а не на 47-й. Вот эта строка:
    Код:
    List<Player> var7 = (List<Player>)ShaftWars.destinationWorld.getPlayers();

    Заказчик не создал миры, проверили путём вывода всех загруженных миров
     
Статус темы:
Закрыта.

Поделиться этой страницей