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

Помогите NullPointer

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

  1. Автор темы
    Plasticable

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

    Баллы:
    173
    Skype:
    plasticable
    Имя в Minecraft:
    Plasticable
    Код:
    package ru.Plasticable.KillRanks;
    
    import java.util.HashMap;
    import java.util.logging.Logger;
    
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Main extends JavaPlugin implements Listener
    {
        Logger log = getLogger();
       
        //HashMap<Integer, String> ranks = new HashMap<Integer, String>();
        HashMap<String, PlayerData> playerData = new HashMap<String, PlayerData>();
       
        @Override
        public void onEnable()
        {
            getServer().getPluginManager().registerEvents(this, this);
           
        }
       
    
        @EventHandler
        public void onKill(PlayerDeathEvent event)
        {
            String killer = event.getEntity().getName();
            String victim = event.getEntity().getKiller().getName();
            event.setDeathMessage(ChatColor.RED + victim + " has been slain by " + killer);
           
           
            PlayerData data = playerData.get(killer);
            data.addKill();
            playerData.put(killer, data);
           
        }
       
       
        @EventHandler
        public void onJoin(PlayerJoinEvent event)
        {
            if(!event.getPlayer().hasPlayedBefore())
            {
                PlayerData data = new PlayerData(0, 0);
                data.setKills(0);
                data.setRank(0);
                playerData.put(event.getPlayer().getName(), data);
               
            }
        }
       
        public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) 
        {
    
           if ((cmd.getName().equalsIgnoreCase("rank")) && ((sender instanceof Player)))
           {
              if(args.length > 0)
              {
                  //Тут будет код
              }
              else
              {
                  PlayerData  data = playerData.get(sender.getName());
                 
                  int kills,rank;
                 
                  kills = data.getKills();//NullPointerException
                  rank = data.getRank();
                 
                  sender.sendMessage(String.format("Your rank is %d with %d kills", rank, kills));
              }         
           }
            return false;
        }
    }
    

    Код:
    package ru.Plasticable.KillRanks;
    
    public class PlayerData
    {
        private String player;
        private int kills;
        //private int points;
        //private String deaths;
        private int rank;
       
        public PlayerData(int kills, int rank)
        {
            this.kills = kills;
            this.kills = rank;
        }
       
        public PlayerData getPlayerData()
        {
            return this;
        }
       
        public String getPlayerName()
        {
            return this.player;
        }
       
        public void setPlayerName(String player)
        {
            this.player = player;
        }
       
       
       
        public void addKill()
        {
            this.kills++;
        }
       
        public int getKills()
        {
            return kills;       
        }
       
        public void setKills(int kills)
        {
            this.kills = kills;
        }
       
       
        //Rank
       
        public void setRank(int rank)
        {
            this.rank = rank;
        }
       
        public int getRank()
        {
            return this.rank;
        }
       
        public void promote()
        {
            this.rank++;
        }
       
        public void demote()
        {
            this.rank--;
        }
    }
    
    
     
  2. Хостинг MineCraft
    <
  3. skynetxxx

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

    Баллы:
    123
    Имя в Minecraft:
    skynetxxx
    Всё правильно, у вас NullPointerException потому что вы не удосужились проверить содержимое
    через playerData.containsKey(sender.getName()) или проверить if (data != null)


    А ещё у вас фейл в конструкторе PlayerData:
    [DOUBLEPOST=1420995095,1420994990][/DOUBLEPOST]
    Это не поможет так как int физически не может быть равным null, а вот Integer (объектная прослойка для int) вполне может.[DOUBLEPOST=1420995281][/DOUBLEPOST]Что за чёртовщина творится в теме? Почему мой ответ появляется в конце предпоследнего сообщения, а везде написано, что он является последним сообщением в теме?
     
    Последнее редактирование: 11 янв 2015
  4. Xont

    Xont Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    xOnt
    Для начала, нельзя называть гланвый класс вот так:"Main".
    Далее, просто добавить if() где data.getKills() принимает нулевое значение. \*овощ знает, что я тут только что сморозил*/
     
  5. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Почему нельзя?
     
  6. Xont

    Xont Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    xOnt
    Так было написано на wiki.bukkit.org / bukkit.org. Было написано, что пакеты должны иметь следующий вид me.YourName.YourPluginName, а главный класс называться: <YourPluginName>Main.
    Та что вы на меня набросились-то?! D:
     
  7. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Нет там такого.
     
  8. Xont

    Xont Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    xOnt
    Про Main я видимо читал на форуме bukkit'a,ну не приснилось же мне это!
    Пруф:Имя вашего 'пакета' должно быть таковым: "me.yourname.pluginname" - там где 'yourname' это название пакета и оно не должно содержать Русских букв и слова bukkit. Например: Если ваш плагин называется "TestPlugin", то 'пакет' должен называться так: "me.adamki11s.TestPlugin".
    Теперь наш проект создан, мы можем добавлять файлы классов и начать делать наш плагин. Правой кнопкой по папке "src" и выберите New > Class. Главный класс должен иметь то же имя, как и плагин! Например: Плагин с именем "TestPlugin", то первый класс должен называться так "TestPlugin".
     
  9. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Советую вам найти автора этого туториала и оторвать ему руки.
     
  10. Xont

    Xont Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    xOnt
    Этож Wiki, кому тогда верить-то? .-.
     
  11. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Верьте собственному опыту.
     
  12. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Это всё чушь(кроме русских букв и bukkit). Названия пакетов и главный класс можно называть как угодно. Например все мои пакеты называются "ru.Den_Abr.PluginName", а главный класс PluginNamePlugin(это не обязательное требование, только для структуризации).
     
  13. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Главные классы лучше не называть Main, потому что, если у тебя будет в двух разных плагинах Main класс в одинаковых пакетах, то будет ошибка.
     
  14. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    А зачем делать одинаковые пакеты, интересно?
     
  15. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Не знаю, просто я когда-то давно так сделал, когда был маленький, поэтому и говорю.
     
  16. ykpon

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

    Баллы:
    173
    me.buka.baka.Main - Плагин 1.
    me.buka.bonka.Main - Плагин 2.
    Где будут одинаковые то?
    И какой смысл разные плагины называть одинаково?
     

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