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

Помогите NullPointer

Discussion in 'Разработка плагинов для новичков' started by Plasticable, Jan 11, 2015.

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

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

    Trophy Points:
    173
    Skype:
    plasticable
    Имя в Minecraft:
    Plasticable
    Code:
    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;
        }
    }
    

    Code:
    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 Старожил Пользователь

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


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

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

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

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

    Trophy Points:
    173
    Skype:
    shkurovs
    Почему нельзя?
     
  6. Xont

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

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

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

    Trophy Points:
    173
    Skype:
    shkurovs
    Нет там такого.
     
  8. Xont

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Share This Page