我有以下简单的代码来模拟猫狩猎:
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)
为什么呢?我该如何解决这个问题?
答案 0 :(得分:4)
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
(所以我们现在{{1} }})。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
。好吧,鉴于Netbeans警告是错误的(因为RuntimeException("x_x")
在第一次迭代中肯定是 catLevel
),最简单的解决方案就是恢复你的{{1检查并忽略警告。
如果您希望,可以通过单击左侧警告旁边的灯泡,浏览菜单,然后选择&#34;禁用警告&#34;来禁用警告。虽然从长远来看,如果能够提供质量更好的代码,我本人宁愿忍受一个加重的黄色下划线。
或者,将null
增加到null
,或将level
减少到4
,或更改hunger
语句以检查3
是否if
答案 1 :(得分:1)
对于它的价值,当我尝试使用以下代码时,我没有看到警告:
Product Version: NetBeans IDE 8.0 (Build 201403101706)
Java: 1.8.0; Java HotSpot(TM) 64-Bit Server VM 25.0-b70
Runtime: Java(TM) SE Runtime Environment 1.8.0-b132
System: Windows 8 version 6.2 running on amd64; Cp1252; en_US (nb)
所以我怀疑这是NetBeans中的一个误报警告,后来被修复了。
也就是说,通过将null
的初始值更改为hunger
,您可以在不进行3
检查的情况下获得相同的输出,例如
public class HuntigSaeson {
int hunger = 3;
...
void hunt() {
Integer catLevel;
do {
rest();
catLevel = new Integer(findCat().split("\\.")[0]);
huntCat(catLevel);
if (hunger > 5) throw new RuntimeException("x_x");
} while (hunger > 0);
System.out.println("^_^");
}
...
}
答案 2 :(得分:0)
作为一个简单的答案:Netbeans警告是错误的。 Netbeans说表达式永远不会为null,尽管在第一次迭代中它是null。 只需忽略警告。 并非所有警告都是要处理的。这就是为什么Netbeans本身可配置为关闭/开启的原因。
我不建议将其停用为:
现在应该已经使用早期版本的Netbeans解决了这个问题。
它不会禁用其他真正的&#34;永不为空的表达式&#34;
答案 3 :(得分:0)
尝试以下方法:
void hunt() {
try {
while (hunger > 0) {
huntCat(new Integer(findCat().split("\\.")[0]));
if (hunger > 5)
throw new RuntimeException("x_x");
rest();
}
} catch (NoSuchElementException e) {
}
System.out.println("^_^");
}
答案 4 :(得分:-2)
NetBeans报告的错误消息实际上与其预期的相反:)
你的if条件总是为null,所以rest()永远不会被执行,因此饥饿将保持在4。
然而,当你删除if条件时,reset()被调用并且饥饿值增加到5,因此稍后代码崩溃,因为如果它的值大于5(现在将超过5),则抛出异常调用上面几行中的其他方法。
NetBeans所说的可能是错误的(表达式永远不会为空),它应该说(表达式始终为null)。
修复代码逻辑..