我有以下简单的代码来模拟猎猫:

import java.util.Arrays;
import java.util.LinkedList;

public class HuntigSaeson {
    int hunger = 4;
    int level = 3;
    LinkedList<String> cats = new LinkedList<String>(Arrays.asList(
        "1.Ginger",
        "3.Porkchops",
        "2.Muffin",
        "2.Max",
        "1.Carrot",
        "2.Puffy",
        "1.Fatty"
    ));

    void hunt() {
        Integer catLevel = null;
        do {
            if (catLevel != null)
              rest();
            catLevel = new Integer(findCat().split("\\.")[0]);
            huntCat(catLevel);
            if (hunger > 5) throw new RuntimeException("x_x");
        } while (hunger > 0);
        System.out.println("^_^");
    }

    void rest() { hunger += 1; }

    String findCat() {
        hunger += 1;
        String c = cats.pop();
        System.out.println("found " + c);
        return c;
    }

    private void huntCat(int catLevel) {
        hunger += 1;
        if (catLevel < level) {
            System.out.println("chomp chomp chomp");
            hunger -= 4;
        }
    }

    public static void main(String[] args) { new HuntigSaeson().hunt(); }
}

它产生以下输出:
found 1.Ginger
chomp chomp chomp
found 3.Porkchops
found 2.Muffin
chomp chomp chomp
found 2.Max
chomp chomp chomp
found 1.Carrot
chomp chomp chomp
found 2.Puffy
chomp chomp chomp
found 1.Fatty
chomp chomp chomp
^_^

空比较行的目的是我不想在寻找第一只猫之前休息。 Netbeans突出显示了这一行,说我应该删除它。

所以我通过改变
            if (catLevel != null)
              rest();


          rest();

但是现在我死了:
found 1.Ginger
chomp chomp chomp
found 3.Porkchops
Exception in thread "main" java.lang.RuntimeException: x_x
    at HuntigSaeson.hunt(HuntigSaeson.java:24)
    at HuntigSaeson.main(HuntigSaeson.java:46)

为什么?我怎样才能解决这个问题?

最佳答案

删除null检查后,为什么我的应用程序中断?
首先要注意的是:Netbeans警告是错误的。
通过删除null周围的rest();检查,您的,可更改do while循环的第一次运行的流程。重要的是,您允许调用rest()。这样做的最终结果是,现在hunger比您将null检查保留在原位时大了。
现在正在发生的事情是:

  • 第一个循环迭代开始: hunger = 4, level = 3
  • rest()称为:hunger递增为5
  • findCat()称为:hunger递增到6,返回"1.Ginger"
  • huntCat(1)称为:hunger递增为7
  • 1 < 3(catLevel < level)的计算结果为true,导致hunger减少4(所以我们现在在3)。
  • hunger不大于5,因此继续进行下一个迭代。
  • 第二个循环迭代开始: hunger = 3, level = 3
  • rest()被调用,hunger递增到4
  • 称为findCat()hunger递增为5,返回"3.Porkchops"
  • huntCat(3)被调用,hunger递增到6
  • 3 < 3(catLevel < level)评估为false hunger不会递减
  • hunger大于5,因此会抛出RuntimeException("x_x")

  • 我怎样才能解决这个问题?
    好吧,鉴于Netbeans警告是错误的(因为catLevel在第一次迭代中肯定是null),所以最简单的解决方案是恢复null检查并忽略警告。
    如果需要,可以通过单击左侧警告旁边的灯泡,浏览菜单并选择“禁用警告”来禁用警告。虽然就个人而言,如果从长远来看它会导致更好的质量代码,我宁愿忍受一个加重的黄色下划线。
    或者,将level增大为4,或将hunger减小为3,或更改您的if语句以检查是否是hunger > 6

    10-04 18:57