ページ 11

[解決済み][Spigot]自作プラグインにてNullPointerExceptionが発生します

Posted: 2020年7月06日(月) 19:37
by Reiga
私が運営するRPGサーバーにて使用する予定のPluginがNullPointerExceptionを吐きます。

・エラーログ(一部)
Spoiler
Show

コード: 全て選択

[19:39:32] [Server thread/WARN]: [RPGSystem] Task #5 for RPGSystem v2.0.0-build.73 generated an exception
java.lang.NullPointerException: null
	at reiga.plugin.rpgsystem.PluginMain$2.run(PluginMain.java:89) ~[?:?]
	at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftTask.run(CraftTask.java:76) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:361) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:739) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at java.lang.Thread.run(Unknown Source) [?:1.8.0_231]
[19:39:33] [Server thread/WARN]: [RPGSystem] Task #5 for RPGSystem v2.0.0-build.73 generated an exception
java.lang.NullPointerException: null
	at reiga.plugin.rpgsystem.PluginMain$2.run(PluginMain.java:89) ~[?:?]
	at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftTask.run(CraftTask.java:76) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:361) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:739) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at java.lang.Thread.run(Unknown Source) [?:1.8.0_231]
[19:39:33] [User Authenticator #1/INFO]: UUID of player xRa1ga is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
[19:39:34] [Server thread/ERROR]: Could not pass event PlayerJoinEvent to RPGSystem v2.0.0-build.73
org.bukkit.event.EventException: null
	at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.PlayerList.onPlayerJoin(PlayerList.java:346) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.PlayerList.a(PlayerList.java:166) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.LoginListener.b(LoginListener.java:159) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.LoginListener.e(LoginListener.java:57) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.NetworkManager.a(NetworkManager.java:233) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.ServerConnection.c(ServerConnection.java:140) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:845) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at java.lang.Thread.run(Unknown Source) [?:1.8.0_231]
Caused by: java.lang.NullPointerException
	at reiga.plugin.rpgsystem.items.MenuStar.setMenuStarMeta(MenuStar.java:27) ~[?:?]
	at reiga.plugin.rpgsystem.items.MenuStar.<init>(MenuStar.java:22) ~[?:?]
	at reiga.plugin.rpgsystem.listener.PlayerListener.onPlayerServerJoin(PlayerListener.java:52) ~[?:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231]
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_231]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_231]
	at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_231]
	at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	... 14 more
[19:39:34] [Server thread/ERROR]: Could not pass event PlayerJoinEvent to RPGSystem v2.0.0-build.73
org.bukkit.event.EventException: null
	at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.PlayerList.onPlayerJoin(PlayerList.java:346) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.PlayerList.a(PlayerList.java:166) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.LoginListener.b(LoginListener.java:159) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.LoginListener.e(LoginListener.java:57) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.NetworkManager.a(NetworkManager.java:233) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.ServerConnection.c(ServerConnection.java:140) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:845) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at java.lang.Thread.run(Unknown Source) [?:1.8.0_231]
Caused by: java.lang.NullPointerException
	at reiga.plugin.rpgsystem.entity.player.RPGPlayer.getClasses(RPGPlayer.java:173) ~[?:?]
	at reiga.plugin.rpgsystem.listener.UIListener.onPlayerJoinSidebar(UIListener.java:38) ~[?:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231]
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_231]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_231]
	at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_231]
	at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	... 14 more
[19:39:34] [Server thread/INFO]: xRe1ga[/127.0.0.1:60244] logged in with entity id 336 at ([world]265.5, 64.0, 262.5)
[19:39:34] [Server thread/WARN]: [RPGSystem] Task #5 for RPGSystem v2.0.0-build.73 generated an exception
java.lang.NullPointerException: null
	at reiga.plugin.rpgsystem.PluginMain$2.run(PluginMain.java:89) ~[?:?]
	at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftTask.run(CraftTask.java:76) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:361) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:739) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
	at java.lang.Thread.run(Unknown Source) [?:1.8.0_231]

私が質問したいのは、
・Runnableで実装した消えないActionBar(ActionBarAPI使用)のNullPointerException
ActionBar実装部分
Show

コード: 全て選択

	public void setupActionBar() {
		int actionBarDelay = getConfig().getInt("actionbarUpdateDelay");
		//Player player = rpgplayer.getPlayer();
		Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
			@Override
			public void run() {
				ActionBarAPI.sendActionBarToAllPlayers("§a§l[[[§r §c§lレベル: Lv." + (int)rpgplayer.getLvl() + "§r §e§l==§r §c§lHP: " + (int)player.getHealth() + " §e§l==§r §c§lEXP: " + (int)rpgplayer.getXp() + "§r §e§l==§r §c§l所持金: " + (int)rpgplayer.getMoney() + " REM§r §a§l]]]"); //ここでぬるぽ
			}
		}, 0, actionBarDelay*20);
	}

・PlayerJoinEventにあるMenuStarアイテム登録部分のNullPoinerException
PlayerJoinEvent、MenuStar部分
Show

コード: 全て選択

	@EventHandler
	public void onPlayerServerJoin(PlayerJoinEvent event) {
		MenuStar menuStar = new MenuStar(Material.NETHER_STAR, "§d§lメニュー", false, 1);
		....
		if(!player.hasPlayedBefore()) {
			inv.setItem(44, menuStar);
		} else {
			....
		}
	}
MenuStar.class
Show

コード: 全て選択

public class MenuStar extends ItemStack {
	private final String name;

	private final boolean tradeable;

	protected List<ItemsStatus> effects = new ArrayList<>();

	public MenuStar(Material type, String name, boolean tradeable, int amount) {
		this.tradeable = tradeable;
		this.name = name;
		setAmount(amount);
		setMenuStarMeta(); //ここでぬるぽ
	}

	public void setMenuStarMeta() {
		ItemMeta meta = getItemMeta();
		meta.setDisplayName(ChatColor.WHITE + "§d§lメニュー");
		setItemMeta(meta);
	}

	public List<ItemsStatus> getEffects() {
		return this.effects;
	}

	public int getRequireLevel() {
		return 0;
	}

	public String getRequireRPGClass() {
		return null;
	}

	public String getName() {
		return this.name;
	}

	public String getLore() {
		return null;
	}

	public static boolean isMenuStar(ItemStack stack) {
		if (stack.getItemMeta().getDisplayName().equals(ChatColor.WHITE + "§d§lメニュー"))
			return true;
		return false;
	}

	public boolean isTradeable() {
		return this.tradeable;
	}
}

・ステータス表示をするScoreBoard登録をするUIListenerのNullPointerException
UIListener.class(Scoreboard)
Show

コード: 全て選択

	@EventHandler
	public void onPlayerJoinSidebar(PlayerJoinEvent event) {
		Player player = event.getPlayer();
		RPGPlayer rpgPlayer = new RPGPlayer(player);
		ScoreboardManager sbmanager = Bukkit.getScoreboardManager();
		Scoreboard sb = sbmanager.getNewScoreboard();

		Objective obj = sb.registerNewObjective("RPG", "");
		obj.setDisplayName(ChatColor.GREEN + "Reiga RPG");
		obj.setDisplaySlot(DisplaySlot.SIDEBAR);

		Score empty2 = obj.getScore(" ");
		Score empty = obj.getScore("");
		Score classes = obj.getScore(ChatColor.YELLOW + ">> Class");
		Score classname = obj.getScore("    " + rpgPlayer.getClasses()); //ここでぬるぽ
		Score rank = obj.getScore(ChatColor.YELLOW + ">> Rank");
		Score rankname = obj.getScore("    " + rpgPlayer.getPrefix());
		Score address = obj.getScore(ChatColor.AQUA + "re1gaserver.f5.si");
		classes.setScore(7);
		classname.setScore(6);
		empty2.setScore(5);
		rank.setScore(4);
		rankname.setScore(3);
		empty.setScore(2);
		address.setScore(1);

		obj = sb.registerNewObjective("Health", "health");
		obj.setDisplaySlot(DisplaySlot.BELOW_NAME);
		obj.setDisplayName("Health: " + ChatColor.RED);

		for(Player players : Bukkit.getOnlinePlayers()) {
			obj.getScore(players).setScore((int)players.getHealth());
		}
		player.setScoreboard(sb);
	}
getterがある、RPGPlayer.class
Show

コード: 全て選択

public class RPGPlayer {

	private Player player;

	private PlayerManager playerManager;

	private int lvl, mp, sp, xp, vit, str, agi, tec, luk, atk, cri, def, res;

	private int logincount;

	private long money;

	private String prefix;

	private String prefixName;

	private String classes;

	public RPGPlayer(Player player) {
		this.player = player;
	}

	public int getVit() {
		//this.uuid = uuid;
		//return vit;
		return playerManager.getData().getInt("Status.VIT");
	}

	public void setVit(int vit) {
		playerManager.getData().set("Status.VIT", vit);
		playerManager.save();
	}

	public int getStr() {
		return str;
	}

	public void setStr(int str) {
		this.str = str;
	}

	public int getAgi() {
		return agi;
	}

	public void setAgi(int agi) {
		this.agi = agi;
	}

	public int getTec() {
		return tec;
	}

	public void setTec(int tec) {
		this.tec = tec;
	}

	public int getLuk() {
		return luk;
	}

	public void setLuk(int luk) {
		this.luk = luk;
	}

	public int getAtk() {
		return atk;
	}

	public void setAtk(int atk) {
		this.atk = atk;
	}

	public int getCri() {
		return cri;
	}

	public void setCri(int cri) {
		this.cri = cri;
	}

	public int getDef() {
		return def;
	}

	public void setDef(int def) {
		this.def = def;
	}

	public int getRes() {
		return res;
	}

	public void setRes(int res) {
		this.res = res;
	}

	public int getLvl() {
		return playerManager.getData().getInt("Status.Level");
	}

	public void setLvl(int lvl) {
		this.lvl = lvl;
	}

	public int getMp() {
		return mp;
	}

	public void setMp(int mp) {
		this.mp = mp;
	}

	public int getSp() {
		return sp;
	}

	public void setSp(int sp) {
		this.sp = sp;
	}

	public int getXp() {
		return playerManager.getData().getInt("Status.Experience");
	}

	public void setXp(int xp) {
		this.xp = xp;
	}

	public int getLogincount() {
		return this.logincount;
	}

	public void setLogincount(int logincount) {
		this.logincount = logincount;
	}

	public void addLogincount(int i) {
		setLogincount(i + getLogincount());
	}

	public String getPrefix() {
		return playerManager.getData().getString("Prefix");
	}

	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}

	public String getPrefixName() {
		return playerManager.getData().getString("PrefixName");
	}

	public void setPrefixName(String prefixName) {
		this.prefixName = prefixName;
	}

	public long getMoney() {
		return playerManager.getData().getInt("Status.Money");
	}

	public void setMoney(long money) {
		this.money = money;
	}

	public String getClasses() {
		return playerManager.getData().getString("Class");
	}

	public void setClasses(String classes) {
		this.classes = classes;
	}

	public Player getPlayer() {
		return this.player;
	}

	public UUID getUUID() {
		return getPlayer().getUniqueId();
	}

	public void addStatus(String statusName, int param) {
		if(statusName == "vit") {
			setVit(getVit() + param);
		} else if(statusName == "str") {
			setStr(getStr() + param);
		} else if(statusName == "agi") {
			setAgi(getAgi() + param);
		} else if(statusName == "tec") {
			setTec(getTec() + param);
		} else if(statusName == "luk") {
			setLuk(getLuk() + param);
		} else if(statusName == "atk") {
			setAtk(getAtk() + param);
		} else if(statusName == "cri") {
			setCri(getCri() + param);
		} else if(statusName == "def") {
			setDef(getDef() + param);
		} else if(statusName == "res") {
			setRes(getRes() + param);
		} else if(statusName == "mp") {
			setMp(getMp() + param);
		} else if(statusName == "sp") {
			setSp(getSp() + param);
		} else if(statusName == "xp") {
			setXp(getXp() + param);
		} else {
			player.sendMessage("Add status Failed");
		}
	}

	public void resetStatus() {
		this.vit = 1;
		this.str = 1;
		this.agi = 1;
		this.tec = 1;
		this.luk = 1;
		this.atk = 1;
		this.cri = 1;
		this.def = 1;
		this.res = 1;
		this.mp = 1;
		this.sp = 20;
		this.xp = 0;
		this.lvl = 1;
	}
RPGPlayerのgetClassesが参照しているPlayerManager.class
Show

コード: 全て選択

public class PlayerManager {
	//private static HashMap<UUID, RPGPlayer> players = new HashMap<>();

	private String uuid;

	private FileConfiguration config;

	private static File dataFileDir;

	private File file;

	private static PluginMain plugin;

	private boolean isDebug;

	public static void setupPlayerDataDir(PluginMain _plugin) {
		plugin = _plugin;
		dataFileDir = new File(plugin.getDataFolder() + File.separator + "players");
		if(!dataFileDir.exists())  {
			dataFileDir.mkdir();
			plugin.getLogger().log(Level.INFO, "players data dir has been generated");
		}
	}

	public PlayerManager(String uuid) {
		this.uuid = uuid;
		this.file = new File(dataFileDir + File.separator + this.uuid + ".yml");
		if (this.file.exists()) {
			this.file = new File(dataFileDir + File.separator + this.uuid + ".yml");
			try {
				this.file.createNewFile();
				if(this.isDebug)
					plugin.getLogger().log(Level.INFO, "player data file: " + this.uuid + ".yml has been created");
			} catch (Exception e) {
				plugin.getLogger().log(Level.SEVERE, "player data file: " + this.uuid + ".yml could not be created! Reason: " + e.getMessage());
				if(this.isDebug)
					e.printStackTrace();
			}
		}
		this.config = (FileConfiguration)YamlConfiguration.loadConfiguration(this.file);
	}

	public FileConfiguration getData() {
		return this.config;
	}

	public File getFile() {
		return this.file;
	}

	public void save() {
		try {
			this.config.save(this.file);
		} catch (IOException e) {
			plugin.getLogger().log(Level.SEVERE, "player data file: " + this.uuid + ".yml could not be saved! Reason: " + e.getMessage());
			if(this.isDebug)
				e.printStackTrace();
		}
	}

	public void saveDefault() {
		try {
			getData().addDefault("Name", "PlayerName");
			getData().addDefault("LoginCount", 1);
			getData().addDefault("Prefix", " ");
			getData().addDefault("PrefixName", "none");
			getData().addDefault("Class", "§f§lNone§r");
			getData().addDefault("Status.HealthPoint", 50);
			getData().addDefault("Status.MagicPoint", 20);
			getData().addDefault("Status.StatusPoint", 0);
			getData().addDefault("Status.Level", 1);
			getData().addDefault("Status.Experience", 0);
			getData().addDefault("Status.Money", 1000);
			getData().addDefault("Status.VIT", 1);
			getData().addDefault("Status.STR", 1);
			getData().addDefault("Status.AGI", 1);
			getData().addDefault("Status.TEC", 1);
  			getData().addDefault("Status.LUK", 1);
			getData().addDefault("Status.ATK", 1);
			getData().addDefault("Status.CRI", 1);
			getData().addDefault("Status.DEF", 1);
			getData().addDefault("Status.RES", 1);
		} catch (Exception e) {
			plugin.getLogger().log(Level.SEVERE, "player data file: " + this.uuid + ".yml could not be saved! Reason: " + e.getMessage());
			if(this.isDebug)
				e.printStackTrace();
		}
	}

	public void login() {
		try {
			getData().getString("Name");
			getData().getInt("LoginCount");
			getData().getString("Prefix");
			getData().getString("PrefixName");
			getData().getString("Class");
			getData().getInt("Status.HealthPoint");
			getData().getInt("Status.MagicPoint");
			getData().getInt("Status.StatusPoint");
			getData().getInt("Status.Level");
			getData().getInt("Status.Experience");
			getData().getInt("Status.Money");
			getData().getInt("Status.VIT");
			getData().getInt("Status.STR");
			getData().getInt("Status.AGI");
			getData().getInt("Status.TEC");
  			getData().getInt("Status.LUK");
			getData().getInt("Status.ATK");
			getData().getInt("Status.CRI");
			getData().getInt("Status.DEF");
			getData().getInt("Status.RES");
		} catch (Exception e) {
			plugin.getLogger().log(Level.SEVERE, "player data file: " + this.uuid + ".yml could not be loaded! Reason: " + e.getMessage());
			if(this.isDebug)
				e.printStackTrace();
		}
	}
}
の解決方法になります。わかる方がいらっしゃったら教えてくれると嬉しいです。

開発環境:
Eclipse IDE 2020-06
JDK 8u231
Spigot-1.12.2-R0.1

要求Plugin:
ActionBarAPI-1.5.4
ProtocolLib(最新)

Re: [Spigot]自作プラグインにてNullPointerExceptionが発生します

Posted: 2020年7月22日(水) 00:04
by mi10tsuhashi
一つ目のRunnableで実装した消えないActionBar(ActionBarAPI使用)のNullPointerException と、最後のステータス表示をするScoreBoard登録をするUIListenerのNullPointerException はおそらく同じ原因です。どちらも内部でRPGPlayerクラスのインスタンスメソッドを使っていますが、その中でもgetXpやgetClassesでは内部でRPGPlayerのprivateなインスタンスフィールドであるPlayerManager型のplayermanagerフィールドを参照していますが、これが初期化されている部分がないためこのフィールドにはnullが格納されているままです。そのため、このフィールドを参照した段階でNullPointerExceptionがスローされます。
回避策としては、RPGPlayerのコンストラクタ内で初期化を行う、RPGPlayerクラス使用時に初期化をするためのセッターメソッドを実装し、利用時はこれを呼び出すなどが考えられます。個人的にはコード量を減らせるため前者のコンストラクタの初期化での実装をお勧めします。
最後に、二つ目のPlayerJoinEventにあるMenuStarアイテム登録部分のNullPoinerException ですが、これはItemStackを継承したMenuStarクラスを利用するときに、ItemStackで定義されているgetItemMetaメソッドを使用していますが、これはItemStackクラス内部のMaterial型のフィールドであるtypeが初期化されていない
段階で呼び出すとNUllpointerExceptionをスローします。
回避策としては、MenuStarクラスではコンストラクタのシグニチャとしてMaterial型の引数を要求していますので、MenuStarクラスのコンストラクタ内でsuper.setType()を呼び出し、この引数をそのまま渡すことでItemStackのtypeフィールドも初期化され正常に動くかと思います。

以下はこのItemStackのgetItemMetaメソッドの挙動を確認するテストコードです。一回目の呼び出しではItemStackのtypeフィールドが初期化されていないためgetItemMetaの戻り値はnullを返し、コンソールにはtypeセット前: trueと表示されますが、二回目では初期化されているためtypeセット後: falseを返します。

コード: 全て選択

package test;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

public class ItemStackChild extends ItemStack{
    public ItemStackChild (){
    	ItemMeta meta = getItemMeta();
    	Bukkit.getConsoleSender().sendMessage("typeセット前:  "+(String.valueOf(meta==null)));
    	setType();
    	meta = getItemMeta();
    	Bukkit.getConsoleSender().sendMessage("typeセット後:  "+(String.valueOf(meta==null)));
    }
    private void setType() {
    	super.setType(Material.ACACIA_BOAT);
    }
}

Re: [Spigot]自作プラグインにてNullPointerExceptionが発生します

Posted: 2020年7月22日(水) 03:31
by Reiga
一つ目と三つ目は、RPGPlayer内で初期化していなかったからなんですね。。。
コンストラクタ内でPlayerManagerのインスタンスを初期化をしておきます。

二つ目は、先にMaterialのTypeを指定しておかないと、初期化されずにNullが返されるのか。。。なるほど。。。

参考にします!テストコードまで書いていただきありがとうございます!
以下はこのItemStackのgetItemMetaメソッドの挙動を確認するテストコードです。一回目の呼び出しではItemStackのtypeフィールドが初期化されていないためgetItemMetaの戻り値はnullを返し、コンソールにはtypeセット前: trueと表示されますが、二回目では初期化されているためtypeセット後: falseを返します。

コード: 全て選択

package test;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

public class ItemStackChild extends ItemStack{
    public ItemStackChild (){
    	ItemMeta meta = getItemMeta();
    	Bukkit.getConsoleSender().sendMessage("typeセット前:  "+(String.valueOf(meta==null)));
    	setType();
    	meta = getItemMeta();
    	Bukkit.getConsoleSender().sendMessage("typeセット後:  "+(String.valueOf(meta==null)));
    }
    private void setType() {
    	super.setType(Material.ACACIA_BOAT);
    }
}
返信してくれてありがとうございます。