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

Tez*_*zra 5 java if-statement

给出表单中的简单if语句

public static String test(boolean flag) {
    if (!flag) {
        return "no";
    } else {
        System.out.println("flag enabled");
    }
    return "yes";
}
Run Code Online (Sandbox Code Playgroud)

要么

public static String test(final boolean flag) 
{
    if (flag) 
    {
        System.out.println("flag enabled");
        return "yes";
    } 
    else 
    {
        return "no";
    }
}
Run Code Online (Sandbox Code Playgroud)

Eclipse给了我警告,强调整个其他块

声明不必要地嵌套在else子句中.相应的then子句不能正常完成

但是,这......

public static String test(final boolean flag) 
{
    if (flag) 
    {
        System.out.println("flag enabled");
        return "yes";
    }
    return "no";
}
Run Code Online (Sandbox Code Playgroud)

没有发出警告.

这个问题似乎有关系,但我没有在第一个例子的其他地方使用return,否则最终没有.

我知道这只是一个偏好,它可以被关闭.但是,我不喜欢忽视事情只是因为我不明白是什么问题.而且我似乎找不到任何关于为什么Eclipse将其添加为可配置警告的文档.

总而言之,The corresponding then clause does not complete normally意味着什么?这个警告试图保护我的问题是什么?

pkp*_*pnd 14

您可以删除该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";
    }
}
Run Code Online (Sandbox Code Playgroud)

// Doesn't get warning
public static String test(final boolean flag) {
    if (flag) {
        System.out.println("flag enabled");
        return "yes";
    }
    return "no";
}
Run Code Online (Sandbox Code Playgroud)

所以归结为风格偏好.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;
}
Run Code Online (Sandbox Code Playgroud)

一段时间后,该团队认为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;
}
Run Code Online (Sandbox Code Playgroud)

现在有一个错误,因为程序员进行了"乍一看"的最短变化 - 如果行为不端,那只可怜的狗就不会被喂食.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;
}
Run Code Online (Sandbox Code Playgroud)