Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Null Pointer

Тема в разделе "Разработка плагинов для новичков", создана пользователем Fenix78563, 18 дек 2016.

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

    Fenix78563 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Доброго времени суток, форумчане. Ловит NullPointer, хотя объект не null

    Код:
    public class moveBullet extends BukkitRunnable{
      
        private Player p;
        private Firework Bullet;
    
        public moveBullet(Player pl, Firework bul){
            this.p=pl;
            this.Bullet=bul;
        }
        final Vector vc = p.getLocation().getDirection();
        Double y = vc.getY();
      
        @Override
        public void run() {
            p.sendMessage("as"); //специально для проверки null
            if (Bullet.isDead()){
                cancel();
            }
            cancel();
        }
    
    }
    null в строке
    Код:
    final Vector vc = p.getLocation().getDirection();
    Когда отключаю из кода строки
    Код:
    final Vector vc = p.getLocation().getDirection();
        Double y = vc.getY();
    то все пашет. Даже сообщение приходит. Т.е. игрок не null

    В чем подвох?
    Заранее спасибо
     
  2. Хостинг MineCraft
    <
  3. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Подвох в отсутствие стак трейса. Вангов нету.
     
  4. Автор темы
    Fenix78563

    Fenix78563 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Код:
    [Poligon] Task #91 for Poligon v0.1 generated an exception
    java.lang.NullPointerException
        at ru.blc.poligon.utils.moveBullet.<init>(moveBullet.java:17) ~[?:?]
        at ru.blc.poligon.entity.Bullet.launchBullet(Bullet.java:28) ~[?:?]
        at ru.blc.poligon.Shooting.onShot.run(onShot.java:21) ~[?:?]
        at org.bukkit.craftbukkit.v1_10_R1.scheduler.CraftTask.run(CraftTask.java:71) ~[server.jar:git-Spigot-90f61bc-6053c5c]
        at org.bukkit.craftbukkit.v1_10_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [server.jar:git-Spigot-90f61bc-6053c5c]
        at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:723) [server.jar:git-Spigot-90f61bc-6053c5c]
        at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:400) [server.jar:git-Spigot-90f61bc-6053c5c]
        at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:668) [server.jar:git-Spigot-90f61bc-6053c5c]
        at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:567) [server.jar:git-Spigot-90f61bc-6053c5c]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_101]
    [23:11:55] [Server thread/INFO]: Type-1[m
    [23:11:55] [Server thread/WARN]: [Poligon] Task #92 for Poligon v0.1 generated an exception
    java.lang.NullPointerException
        at ru.blc.poligon.utils.moveBullet.<init>(moveBullet.java:17) ~[?:?]
        at ru.blc.poligon.entity.Bullet.launchBullet(Bullet.java:28) ~[?:?]
        at ru.blc.poligon.Shooting.onShot.run(onShot.java:21) ~[?:?]
        at org.bukkit.craftbukkit.v1_10_R1.scheduler.CraftTask.run(CraftTask.java:71) ~[server.jar:git-Spigot-90f61bc-6053c5c]
        at org.bukkit.craftbukkit.v1_10_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [server.jar:git-Spigot-90f61bc-6053c5c]
        at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:723) [server.jar:git-Spigot-90f61bc-6053c5c]
        at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:400) [server.jar:git-Spigot-90f61bc-6053c5c]
        at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:668) [server.jar:git-Spigot-90f61bc-6053c5c]
        at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:567) [server.jar:git-Spigot-90f61bc-6053c5c]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_101]
     
  5. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    p == null?
    перемести это moveBullet
     
  6. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Пробуй так.

    Код:
    public class moveBullet extends BukkitRunnable{
        private Player p;
        private Firework Bullet;
        public moveBullet(Player pl, Firework bul){
            this.p=pl;
            this.Bullet=bul;
        }
        @Override
        public void run() {
            Vector vc = p.getLocation().getDirection();
            Double y = vc.getY();
            p.sendMessage("as"); //специально для проверки null
            if (Bullet.isDead()){
                cancel();
            }
            cancel();
        }
    }
     
    Последнее редактирование: 19 дек 2016
  7. Deamonish

    Deamonish Активный участник

    Баллы:
    61
    Проверь дебагером. Как уже сказали, скорее всего p == null. Лучше сделать вот так:
    Код:
    public class moveBullet extends BukkitRunnable{
        private Player p;
        private Firework Bullet;
        private final  Vector vc;
        private double y;
        public moveBullet(Player pl, Firework bul){
            this.p=pl;
            this.Bullet=bul;
            if(pl =! null){
                vc = pl.getLocation().getDirection();
                y = vc.getY();
            } else {
               throw new NullPointerException("Объект player - null");
             }
        }
        @Override
        public void run() {
            p.sendMessage("as");
            if (Bullet.isDead()){
                cancel();
            }
            cancel();
        }
    }
    Т.е делать инициализацию в конструкторе. И проверьте, не передаете ли при создании экземпляра класса moveBullet в конструктор вместо игрока null.
     
  8. Автор темы
    Fenix78563

    Fenix78563 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Угу, да. :)



    Объявляете переменную как final (неизменяемая если что), а потом изменяете ее.
    Я просто похлопаю

    З.Ы. trow'инг игрока на null не проканал, он не null


    Спасибо, работает, но почему? В чем все таки был подвох?
     
  9. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    В том что p был null? джаве почти пофиг на порядок строк для переменных. тоесть делая
    Player p;
    У тебя в любой переменой p будет null.(те что находятся не в методе)
    Location loc=p.getLocation();//null
    Чтобы такого небыло тебе нужно сделать так.
    Player p;
    Location loc;
    метод(Игрок, еще чтото, и еще) {
    p = Игрок;
    loc= p.getLocation();
    }
     
  10. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ты работал с Player до конструктора, вот и был бублик.
     
  11. Sonicxd2

    Sonicxd2 Активный участник Пользователь

    Баллы:
    76
    Засунь эти строки "
    1. final Vector vc = p.getLocation().getDirection();
    2. Double y = vc.getY();
    " в "public moveBullet"
     
  12. Автор темы
    Fenix78563

    Fenix78563 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Спасибо за ответы. В явке получается нельзя использовать методы вне методов?
     
  13. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    В явке нельзя вызывать методы на нулевых объектах
     
  14. Автор темы
    Fenix78563

    Fenix78563 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Ало, он НЕ NULL
     
  15. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Код:
    class {
    Player p;
    method(Player pl) {
    this.p = pl; }
    Location loc = p.getLocation(); //ТУТ ВСЕГДА p == null
    //Хоть поставь это в конец класса, всеравно будет null; Хоть в начало. Везде null будет.
    
    }
     
  16. Автор темы
    Fenix78563

    Fenix78563 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    почему? мы же объявили игрока. или вы заявляете что ява нелинейный язык? (гугл заявляет что ява линейная)
     
  17. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    сначала инициализируются все поля, а только потом выполняется код конструктора
     
  18. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Я тебе написал уже почему. Объект Player был пустым, потому что ты использовал его ДО конструктора, где ты назначаешь значения переменным. Сперва нужно инициализировать класс MyClass myclass new MyClass(передача значений); , а потом уже дальше работать с ними myclass.getUserVector(); Или же как писали выше, получить его сразу в конструкторе, где переменные определились уже.
     
    Последнее редактирование: 20 дек 2016
  19. Автор темы
    Fenix78563

    Fenix78563 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Еще раз спасибо за ответы.
     
Статус темы:
Закрыта.

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