【问题标题】:IllegalArgumentException: Bound must be positive when using Random.nextInt() methodIllegalArgumentException:使用 Random.nextInt() 方法时,Bound 必须为正
【发布时间】:2017-08-11 20:32:01
【问题描述】:
//in a method that checks players equipment to change damage and armor values
    //none of these min/max values should spit out anything less than 0
        switch(weapon)
        {
            case"Knife": minDamage = 3; maxDamage = 12; break;
            case"Short Sword": minDamage = 6; maxDamage = 15; break;
            case"Long Sword": minDamage = 8; maxDamage = 20; break;
            case"Battle Axe": minDamage = 14; maxDamage = 28; break;
            case"Death's Blade": minDamage = 20;maxDamage = 60; break;
        }
        //armor

        switch(armor)
        {
            case"Rags": playerArmor = 0; break;
            case"Hide Armor": playerArmor = 5; break;
            case"Leather Armor": playerArmor = 8; break;
            case"Chainmail": playerArmor = 12; break;
            case"Platemail": playerArmor = 20; break;
            case"Death's Armor": playerArmor = 50; break;
        }


        //in a method that handles the combat
        //The problem is somewhere in the logic for the damageDealt integer.
        int damageDealt = rand.nextInt(maxDamage - minDamage + 1)+minDamage;
        int damageTaken = rand.nextInt(enemyDamage - playerArmor);
        if(damageDealt >= 0)
        {
                enemyHealth -=damageDealt;
        }
        else
        {
                damageDealt = 0;
        }
        if(damageTaken>0)
        {
                playerHealth -=damageTaken;
        }
        else
        {
                damageTaken = 0;    
        }

所以这只是我正在完成的文本冒险中的几行代码。有时我会得到这个错误,弹出说 IllegalArgumentException: Bound must be positive for java's random() method during the battle.

第一段代码是处理玩家物品栏的方法的一部分。请注意,武器的每个最大值都大于相应的最小值,因为它们应该是。第二段代码是战斗方法的一部分。当玩家选择攻击时,这些线就会运行。就我所知,damageDealt 整数似乎是个问题。

我很确定

int damageDealt = rand.nextInt(maxDamage - minDamage + 1)+minDamage;

应该起作用,并且永远不要给出低于 minDamage 值的整数值,甚至为零。但是,出于某种原因,有时它确实如此,并且游戏吓坏了并给出了错误代码。

如果我只使用 maxDamage,则不会出现此问题,但这不是最佳选择,因为超高功率武器的伤害与起始武器一样少。

如果你们能找到一种解决方案来修复我的代码,或者甚至是一种完全不同的方式来处理随机选择整数范围内的数字,我将不胜感激。

【问题讨论】:

  • 您确定错误来自rand.nextInt(maxDamage - minDamage + 1),而不是来自rand.nextInt(enemyDamage - playerArmor)
  • 在您的问题中发布堆栈跟踪。没有就无法回答。

标签: java random integer


【解决方案1】:

以下行可能是您的错误的根源: int damageTaken = rand.nextInt(enemyDamage - playerArmor);

Random.nextInt() 只会返回一个介于 0(含)和传入的参数(不含)之间的值。因此,如果 enemyDamage - playerArmor 解析为负值,则 nextInt() 将抛出 IllegalArgumentException。

【讨论】:

  • 所以如果我将 playerArmor 移到 () 之外,它可以修复它吗?它会改变数字的显示方式,但老实说,它最终可能会更有意义。
  • @OwenD。是的,我相信将 playerArmor 移动到 Random.nextInt() 之外可能会导致异常停止发生。此外,请确保 int damageDealt = rand.nextInt(maxDamage - minDamage + 1)+minDamage; 也没有评估为负数。 nextInt() 中的零值也可能导致问题。
  • 认为这一切都解决了。感谢大家的帮助!
  • 附带说明,如果您将 playerArmor 移动到 nextInt() 之外,那么您最终可能会得到负伤害。您可能希望在代码中的某处添加一个检查是否有负的damageTaken 值并将其设置为0。如果您通过damageTaken 减少玩家的生命值,那么当playerArmor 高于您的nextInt(enemyDamage) 时,您实际上会治愈玩家hit -- 假设你还没有考虑到这一点。
【解决方案2】:

您的问题在于传递给rant.nextInt(int bound) 方法的值。 正如javadoc所说,这种方法

返回一个伪随机、均匀分布的 int 值,介于 0(包括)和指定值(不包括)之间...

抛出:IllegalArgumentException - 如果 bound 不是正数

所以,你应该传递绑定值 > 0

【讨论】:

    【解决方案3】:

    问题是random.nextInt(x),其中x > 0。要始终具有积极价值,您可以使用:

     random.nextInt(Math.abs(x));
    

    Math.abs(-3) ,将输出 3 ;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多