Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

Статус
Закрыто для дальнейших ответов.

Bars

Старожил
Девелопер
Пользователь
Баллы
173
Получаю ShaftWars.destinationWorld из класса Messenger:
Java:
        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();
В консоли получаю
2015-02-19 21:29:55 [INFO] ShaftWars.destinationWorld == null
2015-02-19 21:29:55 [SEVERE] Could not pass event PlayerInteractEvent to ShaftWars v1.0
org.bukkit.event.EventException
...
Caused by: java.lang.NullPointerException
at ru.onlymc.shaftwars.Messenger.msgNear(Messenger.java:47)
at ru.onlymc.shaftwars.ShaftWars.onPlayerInteract(ShaftWars.java:157)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:441)
... 20 more

В главном классе ShaftWars следующее:

Java:
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 нужно разобраться
 
Ну, приложил не приложил, я же не вижу твой исходник так, чтобы видеть в нём номера строк.
Какая из них есть 47я?
 
why (ShaftWars.destinationWorld == null), if (переменная проинициализирована и не равна null в реале, что было проверено сразу же после этой инициализации)?
Ну, приложил не приложил, я же не вижу твой исходник так, чтобы видеть в нём номера строк.
Какая из них есть 47я?
Первое сообщение перед краш–логом вывело
2015-02-19 21:29:55 [INFO] ShaftWars.destinationWorld == null
За это отвечает строчка 1 из 5, а следующая (2 из 5) — это 47–я
Ой, то есть 5 из 5. Если первые 4 строчки это логгер (отладка) и судя по консоли она работает, то я бы наверное догадался, что последняя и есть 47–я. Ладно, наверное я просто не умею излагать суть
 
Ты сначала проверяешь destinationWorld на null, логируешь это, а потом тут же используешь этот destinationWorld.
 
Тут скорее проблема в том, почему destinationWorld null
Именно так. Потому что я после инициализации проверял на null и результат отрицательный, переменная проинициализирована (см. комментарии к коду):
Java:
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("моё сообщение");
 
У вас ошибка здесь - at ru.onlymc.shaftwars.Messenger.msgNear(Messenger.java:47). Вот этот класс и покажите. Из этого станет понятно что именно проблемит у вас. И я могу ошибаться, но это возвращает не блок под игроком:

Код:
if(!pressurePlateBlockRelatives.contains(player.getLocation().getBlock())){

А поскольку игрок не может находиться в блоках, блок NULL.
 
Последнее редактирование:
@ensirius,
Java:
List<Player> var7 = (List<Player>)ShaftWars.destinationWorld.getPlayers();
Это, конечно, 49-я строка, но до строчек отладки она была 47-й (с той же ошибкой)
Вот, 47-я сейчас на третьей строчке:
Java:
        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();
 
И я могу ошибаться, но это возвращает не блок под игроком:

А поскольку игрок не может находиться в блоках, блок NULL.
Ошибаетесь, иначе сообщения вывелись бы в консоль:
Java:
log.debug("Player block position: " + block.getX() + "," + block.getY() + "," + block.getZ());
log.debug("PressurePlateBlockPosition: " + pressurePlateBlock.getX() + "," + pressurePlateBlock.getY() + "," + pressurePlateBlock.getZ());

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

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

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

Назад
Верх