【问题标题】:method doesn't finish running - works infinitly方法没有完成运行 - 无限工作
【发布时间】:2013-12-04 13:26:13
【问题描述】:

我尝试编写简单的程序并在某个时间点陷入了 while 循环。

从当前输出我看到它只打印相同的数据。

但它应该在每次迭代时执行。

代码片段

public void fight(Droid first, Droid second) {

        while (first.isAlive() & second.isAlive()) {

            if ((random.nextInt(10) + 1) % 2 == 0) {
                shoot(first, second);
            } else {
                shoot(second, first);
            }

            // testing output
            System.out.printf("Droid %s has %d power level%n", first.getName(), first.getPower());
            System.out.printf("Droid %s has %d power level%n", second.getName(), second.getPower());
        }

        if (first.getPower() <= 0) {
            fightResult(second);
        } else {
            fightResult(first);
        }
    }

这是输出

Droid John has 5 power level
Droid Dik has 8 power level
Droid John has 5 power level
Droid Dik has 8 power level
Droid John has 5 power level
Droid Dik has 8 power level
Droid John has 5 power level
Droid Dik has 8 power level

我犯了一些愚蠢的错误,但找不到。

更新:

这里是shoot()

private void shoot(Droid first, Droid second) {
    second.setPower(first.getImpact());
}

Droid 类:

public abstract class Droid {

    protected Random random;
    private String name;
    private int power;
    private int impact;

    public Droid(int aPower, int anImpact) {
        power = aPower;
        impact = anImpact;
    }

    public String getName() {
        return name;
    }

    public void setPower(int aPower) {
        power = aPower;
    }

    public void setImpact(int anImpact) {
        impact = anImpact;
    }

    public int getPower() {
        return power;
    }

    public int getImpact() {
        return impact;
    }

    public abstract void fight(Droid first, Droid second);

    public boolean isAlive() {
        boolean result = false;
        if (this.getPower() > 0) result = true;
        return result;
    }
}
  • 如何解决这个问题?

【问题讨论】:

  • 发布您的shoot 方法。
  • 请给我们展示Droid类的代码和拍摄方法。
  • 考虑编写while (first.isAlive() &amp;&amp; second.isAlive()) { 以提高可读性。不过不是你的问题。
  • @Bathsheba 我删除了我的答案,它说的是同一件事,好电话-虽然不是问题的根源
  • 谢谢@Lucas;但有人涉入同样的答案。是时候施加一些反对意见了。

标签: java while-loop infinity


【解决方案1】:

你的射击方法不正确,它一直将机器人设置为彼此的影响值。

我怀疑你想从机器人的力量中减去影响。

类似的东西

private void shoot(Droid first, Droid second) {
    second.setPower(second.getPower() - first.getImpact());
}

或更多面向对象的风格:

first.shoot(second);

public void shoot(Droid second) {
    second.absorbImpact(getImpact());
}

public void absorbImpact(int impact) {
    power -= impact;
}

【讨论】:

    【解决方案2】:

    试试

    private void shoot(Droid first, Droid second) {
        second.setPower(second.getPower() - first.getImpact());
    }
    

    【讨论】:

      【解决方案3】:

      您必须为其中一个机器人调用 setAlive(false) 以结束无限循环... 在射击时,您将第二个 Droid 的力量设置为第一个 Droid 的影响。但你永远不会降低机器人的影响......

      【讨论】:

        【解决方案4】:

        您似乎在使用 &(按位运算符)而不是 &&(布尔与)

        【讨论】:

        • 不不不不。在这种情况下它们是等价的。虽然我更喜欢 &&
        【解决方案5】:

        改变这个:

        while (first.isAlive() & second.isAlive())
        

        到这里

        while (first.isAlive() && second.isAlive())
        

        【讨论】:

          猜你喜欢
          • 2018-06-20
          • 1970-01-01
          • 1970-01-01
          • 2016-04-02
          • 1970-01-01
          • 2013-08-11
          • 1970-01-01
          • 2019-11-22
          • 1970-01-01
          相关资源
          最近更新 更多