1000000000纳秒似乎不等于秒

时间:2014-11-29 11:16:11

标签: java nanotime

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

现在According to google,一秒钟就有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的系统,如果是,请执行拼写。

2 个答案:

答案 0 :(得分: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变体,它将正常工作。

答案 1 :(得分:5)

Java中的简单数字文字被视为int s,因此您的计算被视为overflows。解决此问题的一种方法是使用long文字执行计算,方法是在文字后添加L

kam.put(p.getName(), System.nanoTime() + (1000000000L * 30L));