1

我正在创造一些魔法咒语,显然我希望每次使用之间有一个延迟。

现在根据谷歌,一秒钟有 1000000000 纳秒。

然而,魔法咒语在不到两秒后就开始充电。

@EventHandler
public void onInteract(PlayerInteractEvent e){
    Player p = e.getPlayer();
    if (p.getItemInHand().getType().equals(Material.BLAZE_ROD)){
        {
            {
                if (!kam.containsKey(p.getName())) kam.put(p.getName(), (long) 0);
                if (kam.get(p.getName()) < System.nanoTime()){
                    kam.remove(p.getName());
                    kam.put(p.getName(), System.nanoTime() + (1000000000 * 30));
                    //Do magic spell attack here.
                    }
                }
            }else{
                p.sendMessage(ChatColor.AQUA + "Skill recharging!");
            }
}

显然,我的代码试图添加System.nanoTime()加 30 秒,然后检查当前系统nanoTime是否大于我放入 hashmap 的系统,如果是,则执行拼写。

4

2 回答 2

5

我建议您打印出该值1000000000 * 30并检查它。您会发现它正在环绕,因为它太大而无法放入整数。

换句话说,以下程序:

public class Test
{
    public static void main(String args[])
    {
        System.out.println(1000000000 * 30);
        System.out.println(1000000000L * 30);
    }
}

打印出来:

-64771072
30000000000

因此,如果您使用该long变体,它将正常工作。

于 2014-11-29T11:20:06.463 回答
5

Java中的裸数字文字被视为ints,因此您的计算会溢出。解决此问题的一种方法是使用文字执行计算,方法是在long文字之后添加L

kam.put(p.getName(), System.nanoTime() + (1000000000L * 30L));
于 2014-11-29T11:21:03.770 回答