Development Assistance Unhandled exeption executing command 'stats' in plugin PlayerStats v1.0

Discussion in 'Plugin Help/Development/Requests' started by datD3v, Sep 28, 2015.

Thread Status:
Not open for further replies.
  1. Offline

    datD3v

    I'm currently working on a PVP Based Stats plugin but when ever I execute:

    /stats or /stats <player>

    I get this error:
    Code:
    [17:50:52] [Server thread/INFO]: Player issued server command: /stats Player
    [17:50:52] [Server thread/ERROR]: null
    org.bukkit.command.CommandException: Unhandled exception executing command 'stats' in plugin PlayerStats v1.0
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:181) ~[Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchCommand(CraftServer.java:767) ~[Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at net.minecraft.server.v1_7_R4.PlayerConnection.handleCommand(PlayerConnection.java:1043) [Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at net.minecraft.server.v1_7_R4.PlayerConnection.a(PlayerConnection.java:880) [Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at net.minecraft.server.v1_7_R4.PacketPlayInChat.a(PacketPlayInChat.java:28) [Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at net.minecraft.server.v1_7_R4.PacketPlayInChat.handle(PacketPlayInChat.java:65) [Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:186) [Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at net.minecraft.server.v1_7_R4.ServerConnection.c(ServerConnection.java:81) [Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:734) [Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289) [Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    Caused by: java.lang.ArithmeticException: / by zero
        at me.fiddycal.ZestStatsMain.onCommand(PlayerStatsMain.java:94) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[Spigot.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
        ... 13 more
    Class File:
    Code:
    package me.datDev;
    
    import java.io.File;
    import java.io.IOException;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.configuration.file.YamlConfiguration;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class PlayerStatsMain extends JavaPlugin
      implements Listener
    {
      File statsFile;
      FileConfiguration stats;
    
      public void onEnable()
      {
        File configFile = new File(getDataFolder(), "config.yml");
        if (!configFile.exists()) {
          saveDefaultConfig();
          getConfig().options().copyHeader(true);
        }
        reloadConfig();
        this.statsFile = new File(getDataFolder(), "stats.yml");
        this.stats = YamlConfiguration.loadConfiguration(this.statsFile);
    
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
      }
    
      public void onDisable()
      {
        saveConfig();
        try {
          this.stats.save(this.statsFile);
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    
      @EventHandler
      public void onPlayerKill(PlayerDeathEvent e) throws IOException {
        Player p = e.getEntity();
        Player killer = e.getEntity().getKiller();
    
        int deathCount = this.stats.getInt(p.getName() + "." + "deaths");
        int killCount = this.stats.getInt(p.getName() + "." + "kills");
        int deathCountK = this.stats.getInt(killer.getName() + "." + "deaths");
        int killCountK = this.stats.getInt(killer.getName() + "." + "kills");
        double kdrp = killCount / deathCount;
        double kdrpkiller = killCountK / deathCountK;
    
        deathCount++;
        killCount++;
        killCountK++;
    
        this.stats.set(p.getName() + "." + "deaths", Integer.valueOf(deathCount));
        this.stats.set(killer.getName() + "." + "kills", Integer.valueOf(killCountK));
        this.stats.set(p.getName() + "." + "ratio", Double.valueOf(kdrp));
        this.stats.set(killer.getName() + "." + "ratio", Double.valueOf(kdrpkiller));
    
        this.stats.save(this.statsFile);
      }
    
      public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args)
      {
        Player p = (Player)sender;
        if (cmd.getName().equalsIgnoreCase("stats")) {
          if (args.length == 0) {
            int killCount = this.stats.getInt(p.getName() + "." + "kills");
            int deathCount = this.stats.getInt(p.getName() + "." + "deaths");
            double kdrp = killCount / deathCount;
            p.sendMessage(ChatColor.translateAlternateColorCodes('&', getConfig().getString("stats_msg").replaceAll("%player", p.getName().toString())));
            p.sendMessage(ChatColor.translateAlternateColorCodes('&', getConfig().getString("kills_msg").replaceAll("%kills", Integer.toString(killCount))));
            p.sendMessage(ChatColor.translateAlternateColorCodes('&', getConfig().getString("deaths_msg").replaceAll("%deaths", Integer.toString(deathCount))));
            p.sendMessage(ChatColor.translateAlternateColorCodes('&', getConfig().getString("kdrp_msg").replaceAll("%kdrp", String.format("%.2f", new Object[] { Double.valueOf(kdrp) }))));
            return false;
          }
          @SuppressWarnings("deprecation")
        Player target = Bukkit.getServer().getPlayer(args[0]);
          if (target == null)
          {
            p.sendMessage(ChatColor.translateAlternateColorCodes('&', getConfig().getString("targetnotfound_msg")));
            return true;
          }
          int killCount = this.stats.getInt(target.getName() + "." + "kills");
          int deathCount = this.stats.getInt(target.getName() + "." + "deaths");
          double kdrp = killCount / deathCount;
          p.sendMessage(ChatColor.translateAlternateColorCodes('&', getConfig().getString("stats_msg").replaceAll("%player", target.getName().toString())));
          p.sendMessage(ChatColor.translateAlternateColorCodes('&', getConfig().getString("kills_msg").replaceAll("%kills", Integer.toString(killCount))));
          p.sendMessage(ChatColor.translateAlternateColorCodes('&', getConfig().getString("deaths_msg").replaceAll("%deaths", Integer.toString(deathCount))));
          p.sendMessage(ChatColor.translateAlternateColorCodes('&', getConfig().getString("kdrp_msg").replaceAll("%kdrp", String.format("%.2f", new Object[] { Double.valueOf(kdrp) }))));
          return false;
        }
    
        if (cmd.getName().equalsIgnoreCase("statsreload")) {
          if (!p.hasPermission("playerstats.reload")) {
            p.sendMessage(ChatColor.translateAlternateColorCodes('&', getConfig().getString("nopermission_msg")));
            return false;
          }
          reloadConfig();
          p.sendMessage(ChatColor.AQUA + "Config successfuly reloaded!");
        }
        return false;
      }
    }
     
  2. Online

    timtower Administrator Administrator Moderator

    @datD3v
    Code:
    double kdrp = killCount / deathCount;
        double kdrpkiller = killCountK / deathCountK;
    One of the death values is 0, that is causing it to throw an error:
    Code:
    Caused by: java.lang.ArithmeticException: / by zero
     
  3. Offline

    datD3v

    Sorry, I'm fairly new to java coding, how would I fix this?
     
  4. Online

    timtower Administrator Administrator Moderator

    @datD3v You check the values before dividing. Or put a try catch around it that puts it at a default value.
     
  5. Offline

    datD3v

    I watched a tutorial to get were i am, he didn't show any errors in the video, can you maybe give me a quick example of how I would do this? How do I check the values before dividing, or how to put a try catch around it that puts it at a default value? Sorry for my bad knowledge. ;-;
     
  6. Online

    timtower Administrator Administrator Moderator

    @datD3v I won't spoonfeed, this is basic java in my opinion, and I expect developers to know basic java before starting with Bukkit.
     
  7. Offline

    datD3v

    basic java in your opinion, A bunch of words and numbers in my opinion, everyone has to start somewhere. If you don't want to help me "moderator" than at least give me a link to a page that can. :/
     
  8. Online

    timtower Administrator Administrator Moderator

Thread Status:
Not open for further replies.

Share This Page