我有以下简单的代码来模拟猎猫:
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
。