-1

基本的に、サーバーで特定のコマンドを入力すると、このコードがすべて複数回 (20 回以上) 読み込まれます。何らかの理由で、コマンドを入力するたびに、サーバーがフリーズします (コンソールを含む)。サーバーを停止して再起動すると、サーバーが実行されているポートに何かがバインドされていると表示されるため、サーバープロセスを強制終了する必要があります。コマンドを発行したときに実行中の計算が多すぎるためですか? 以前はそれほどクラッシュしなかったことを覚えていますが、パーセントバーの計算方法を変更した後は、毎回クラッシュします。

package com.mcvigor.utils;

import java.util.ArrayList;

import org.apache.commons.lang.WordUtils;
import org.bukkit.ChatColor;
import org.bukkit.inventory.meta.ItemMeta;

import com.mcvigor.RunePlayer;
import com.mcvigor.Skills;

public class ItemUtils {

    public static ItemMeta addSkillInformation(ItemMeta i, Skills skill, RunePlayer rp) {
        i.setDisplayName(ChatColor.GOLD + WordUtils.capitalize(skill.toString().toLowerCase()));
        ArrayList<String> lore = new ArrayList<String>();
        lore.add(ChatColor.RED + "Level " + ChatColor.YELLOW + rp.getSkillLevel(skill));
        int xp = rp.getSkillXP(skill);
        int neededXP = rp.getXPRequiredForLevel((rp.getSkillLevel(skill) + 1));
        lore.add(ChatColor.RED + "Experience: " + ChatColor.YELLOW + xp + ChatColor.RED + " / " + ChatColor.YELLOW + neededXP);
        lore.add(ChatColor.RED + "Remainder: " + ChatColor.YELLOW + (neededXP - xp));
        float percent = (xp/neededXP);
        int percent10 = (int) Math.floor(percent * 10);
        String bar = "";
        while (percent10 >= 10) {
            bar += ChatColor.GREEN + "▀";
            percent--;
        }
        while (percent10 < 10) {
            bar += ChatColor.RED + "▀";
            percent10--;
        }
        lore.add(ChatColor.RED + "Percent to next level: " + ChatColor.YELLOW + (int) percent + ChatColor.RED + "%");
        lore.add(bar);
        i.setLore(lore);
        return i;
    }
}

編集:その理由を考えてください:

    while (percent10 < 10) {
        bar += ChatColor.RED + "▀";
        percent10--;
    }

percent10 は常に 10 未満になるため、繰り返し続けます。

4

1 に答える 1

0

ループ終了条件で変数をテストしていますが、その変数はループ内で変更されません:

while (percent10 >= 10) {
        bar += ChatColor.GREEN + "▀";
        percent--;
}

percent10がループ前よりも大きい場合10、augment に十分なメモリがなくなるまでループしますbar

おそらく交換する必要があります

percent--;

percent10--;

直後のループにも同様の問題があります。

while (percent10 < 10) {
        bar += ChatColor.RED + "▀";
        percent10--;
}

percent10 が < 10 の場合、ループ内で 10 を超えることはありません (オーバーフローの場合を除く)。

于 2013-06-28T06:15:33.800 に答える