给出一个简单的if语句
public static String test(boolean flag) {
if (!flag) {
return "no";
} else {
System.out.println("flag enabled");
}
return "yes";
}
或
public static String test(final boolean flag)
{
if (flag)
{
System.out.println("flag enabled");
return "yes";
}
else
{
return "no";
}
}
Eclipse向我发出警告,强调整个其他块
语句不必要地嵌套在else子句中。相应的then子句无法正常完成
然而,这......
public static String test(final boolean flag)
{
if (flag)
{
System.out.println("flag enabled");
return "yes";
}
return "no";
}
没有发出警告。
this问题似乎有关系,但我没有在第一个例子的else中使用return,否则最终没有。
我知道这只是一种偏好,可以关闭它。但是,我不想忽视这些事情只是因为我不明白这是什么问题。而且我似乎无法找到有关为什么Eclipse将其添加为可配置警告的任何文档。
总而言之,The corresponding then clause does not complete normally
是什么意思?这个警告试图保护我的问题是什么?
答案 0 :(得分:12)
您可以删除else
子句,这将删除警告。
要回答你的另一个问题,“相应的then子句没有正常完成”是指“then”子句有一个return语句。完成“正常”意味着控制流继续到“else”块之后的语句,但这不会发生,因为您返回。
:
之间没有逻辑,功能或运行时差异// Gets warning
public static String test(final boolean flag) {
if (flag) {
System.out.println("flag enabled");
return "yes";
} else {
return "no";
}
}
和
// Doesn't get warning
public static String test(final boolean flag) {
if (flag) {
System.out.println("flag enabled");
return "yes";
}
return "no";
}
所以归结为风格偏好。 Eclipse为什么认为这值得警告?可以认为它类似于“无法访问的代码” - 代码的一个方面是不必要的(也许是异常的)冗长的,这通常需要另外一种方法来确保不会隐藏任何逻辑错误。如果我编写第一个代码片段并收到警告,我会感谢Eclipse并愉快地改进代码,到达第二个代码片段。但同样,那只是因为我更喜欢第二个片段。
这是一个可能发挥作用并影响功能的场景(无意中)。假设代码最初看起来像这样:
// Returns true if the dog was fed
boolean feedDog(Dog dog) {
if (!dog.isHungry()) {
return false;
}
Food food;
if (dog.isBadToday()) {
food = getDefaultFood();
} else {
food = getTreat();
}
dog.feed(food);
return true;
}
稍后,如果狗被喂食治疗,团队会决定feedDog
只返回true
。如果代码被修改为:
// Returns true if the dog was fed *a treat*
boolean feedDog(Dog dog) {
if (!dog.isHungry()) {
return false;
}
Food food;
if (dog.isBadToday()) {
food = getDefaultFood();
return false; // Dog wasn't fed a treat
} else {
food = getTreat();
}
dog.feed(food);
return true;
}
现在有一个错误,因为程序员进行了“乍一看”的最短变化 - 如果行为不端,那只可怜的狗就不会被喂食。 Eclipse的警告是在这里拯救狗,告诉程序员注意围绕if
语句的逻辑,这似乎不再正确(根据Eclipse)。希望程序员注意警告并避免从if
块返回:
// Returns true if the dog was fed *a treat*
boolean feedDog(Dog dog) {
if (!dog.isHungry()) {
return false;
}
Food food;
boolean fedTreat = false;
if (dog.isBadToday()) {
food = getDefaultFood();
} else {
food = getTreat();
fedTreat = true;
}
dog.feed(food);
return fedTreat;
}