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

Помогите NullPointer

Plasticable

Старожил
Девелопер
Пользователь
Баллы
173
Имя в Minecraft
Plasticable
Java:
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;
    }
}

Java:
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--;
    }
}
 
Всё правильно, у вас NullPointerException потому что вы не удосужились проверить содержимое
PlayerData data = playerData.get(sender.getName());
через playerData.containsKey(sender.getName()) или проверить if (data != null)


А ещё у вас фейл в конструкторе PlayerData:
this.kills = kills;
this.kills = rank;

Для начала, нельзя называть гланвый класс вот так:"Main".
Далее, просто добавить if() где data.getKills() принимает нулевое значение. \*овощ знает, что я тут только что сморозил*/
Это не поможет так как int физически не может быть равным null, а вот Integer (объектная прослойка для int) вполне может.
Что за чёртовщина творится в теме? Почему мой ответ появляется в конце предпоследнего сообщения, а везде написано, что он является последним сообщением в теме?
 
Последнее редактирование:
Для начала, нельзя называть гланвый класс вот так:"Main".
Далее, просто добавить if() где data.getKills() принимает нулевое значение. \*овощ знает, что я тут только что сморозил*/
 
Для начала, нельзя называть гланвый класс вот так:"Main".
Далее, просто добавить if() где data.getKills() принимает нулевое значение. \*овощ знает, что я тут только что сморозил*/
Почему нельзя?
 
Так было написано на wiki.bukkit.org / bukkit.org. Было написано, что пакеты должны иметь следующий вид me.YourName.YourPluginName, а главный класс называться: <YourPluginName>Main.
Та что вы на меня набросились-то?! D:
 
Так было написано на wiki.bukkit.org / bukkit.org. Было написано, что пакеты должны иметь следующий вид me.YourName.YourPluginName, а главный класс называться: <YourPluginName>Main.

Та что вы на меня набросились-то?! D:
Нет там такого.
 
Про Main я видимо читал на форуме bukkit'a,ну не приснилось же мне это!
Пруф:Имя вашего 'пакета' должно быть таковым: "me.yourname.pluginname" - там где 'yourname' это название пакета и оно не должно содержать Русских букв и слова bukkit. Например: Если ваш плагин называется "TestPlugin", то 'пакет' должен называться так: "me.adamki11s.TestPlugin".
Теперь наш проект создан, мы можем добавлять файлы классов и начать делать наш плагин. Правой кнопкой по папке "src" и выберите New > Class. Главный класс должен иметь то же имя, как и плагин! Например: Плагин с именем "TestPlugin", то первый класс должен называться так "TestPlugin".
 
Про Main я видимо читал на форуме bukkit'a,ну не приснилось же мне это!
Пруф:Имя вашего 'пакета' должно быть таковым: "me.yourname.pluginname" - там где 'yourname' это название пакета и оно не должно содержать Русских букв и слова bukkit. Например: Если ваш плагин называется "TestPlugin", то 'пакет' должен называться так: "me.adamki11s.TestPlugin".
Теперь наш проект создан, мы можем добавлять файлы классов и начать делать наш плагин. Правой кнопкой по папке "src" и выберите New > Class. Главный класс должен иметь то же имя, как и плагин! Например: Плагин с именем "TestPlugin", то первый класс должен называться так "TestPlugin".
Советую вам найти автора этого туториала и оторвать ему руки.
 
Про Main я видимо читал на форуме bukkit'a,ну не приснилось же мне это!
Пруф:Имя вашего 'пакета' должно быть таковым: "me.yourname.pluginname" - там где 'yourname' это название пакета и оно не должно содержать Русских букв и слова bukkit. Например: Если ваш плагин называется "TestPlugin", то 'пакет' должен называться так: "me.adamki11s.TestPlugin".
Теперь наш проект создан, мы можем добавлять файлы классов и начать делать наш плагин. Правой кнопкой по папке "src" и выберите New > Class. Главный класс должен иметь то же имя, как и плагин! Например: Плагин с именем "TestPlugin", то первый класс должен называться так "TestPlugin".
Это всё чушь(кроме русских букв и bukkit). Названия пакетов и главный класс можно называть как угодно. Например все мои пакеты называются "ru.Den_Abr.PluginName", а главный класс PluginNamePlugin(это не обязательное требование, только для структуризации).
 
Главные классы лучше не называть Main, потому что, если у тебя будет в двух разных плагинах Main класс в одинаковых пакетах, то будет ошибка.
 
Главные классы лучше не называть Main, потому что, если у тебя будет в двух разных плагинах Main класс в одинаковых пакетах, то будет ошибка.
А зачем делать одинаковые пакеты, интересно?
 
Главные классы лучше не называть Main, потому что, если у тебя будет в двух разных плагинах Main класс в одинаковых пакетах, то будет ошибка.
me.buka.baka.Main - Плагин 1.
me.buka.bonka.Main - Плагин 2.
Где будут одинаковые то?
И какой смысл разные плагины называть одинаково?
 

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

Назад
Верх