相应的then子句不能正常完成

时间:2018-04-20 15:18:42

标签: java if-statement

给出一个简单的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是什么意思?这个警告试图保护我的问题是什么?

1 个答案:

答案 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;
}